Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 用另一个字符重复替换给定计数(4)处的分隔符_Shell_Unix_Awk - Fatal编程技术网

Shell 用另一个字符重复替换给定计数(4)处的分隔符

Shell 用另一个字符重复替换给定计数(4)处的分隔符,shell,unix,awk,Shell,Unix,Awk,鉴于这一点: 12,34,56,47,56,34,56,78,90,12,12,34,45 如果逗号(,)的计数大于4,请将第4个逗号(,)替换为| 如果计数小于或等于4,则无需替换逗号(,) 我可以通过以下awk找到计数: awk -F\, '{print NF-1}' text.txt 然后我使用if条件检查结果是否大于4。但无法将第四个逗号替换为| | 查找行中分隔符的计数,并用另一个字符替换特定位置 更新: 我想在每出现第四次逗号后用|符号替换逗号。很抱歉给你带来了困惑 预期输出:

鉴于这一点:

12,34,56,47,56,34,56,78,90,12,12,34,45
如果逗号(,)的计数大于4,请将第4个逗号(,)替换为
|

如果计数小于或等于4,则无需替换逗号(,)

我可以通过以下
awk
找到计数:

awk -F\, '{print NF-1}' text.txt
然后我使用if条件检查结果是否大于4。但无法将第四个逗号替换为| |

查找行中分隔符的计数,并用另一个字符替换特定位置

更新: 我想在每出现第四次逗号后用
|
符号替换逗号。很抱歉给你带来了困惑

预期输出:

12,34,56,47||56,34,56,78||90,12,12,34||45
应与任何POSIX sed一起使用

更新:

对于更新后的问题,您可以使用

$ echo 12,34,56,47,56,34,56,78,90,12,12,34,45 | sed -e 's/\(\([^,]*,\)\{3\}[^,]*\),/\1||/g'
12,34,56,47||56,34,56,78||90,12,12,34||45
不幸的是,POSIX sed的
s
命令可以将数字或
g
作为标志,但不能同时使用两者。GNU sed允许这种组合,但在这种情况下它并不能满足我们的需要。所以你必须用正则表达式来解释它

应与任何POSIX sed一起使用

更新:

对于更新后的问题,您可以使用

$ echo 12,34,56,47,56,34,56,78,90,12,12,34,45 | sed -e 's/\(\([^,]*,\)\{3\}[^,]*\),/\1||/g'
12,34,56,47||56,34,56,78||90,12,12,34||45
不幸的是,POSIX sed的
s
命令可以将数字或
g
作为标志,但不能同时使用两者。GNU sed允许这种组合,但在这种情况下它并不能满足我们的需要。所以你必须用正则表达式来解释它

如果计数大于4,我想将第4个逗号(,)替换为 ||

尝试一下这一行(gnu-sed):

测试:

如果计数大于4,我想将第4个逗号(,)替换为 ||

尝试一下这一行(gnu-sed):

测试:

使用awk,您可以执行以下操作:

s='12,34,56,47,56,34,56,78,90,12,12,34,45'
awk -F, '{for (i=1; i<NF; i++) printf "%s%s", $i, (i%4?FS:"||"); print $i}' <<< "$s"
12,34,56,47||56,34,56,78||90,12,12,34||45
s='12,34,56,47,56,34,56,78,90,12,12,34,45'
awk-F'{for(i=1;i使用awk,您可以执行以下操作:

s='12,34,56,47,56,34,56,78,90,12,12,34,45'
awk -F, '{for (i=1; i<NF; i++) printf "%s%s", $i, (i%4?FS:"||"); print $i}' <<< "$s"
12,34,56,47||56,34,56,78||90,12,12,34||45
s='12,34,56,47,56,34,56,78,90,12,12,34,45'
awk-F'{for(i=1;iawk

 awk -F, 'NF-1>4{for(i=1;i<NF;i++){if(i==4)k=k$i"||";else k=k$i","} print k$NF}' filename
awk-F,'NF-1>4{for(i=1;i带awk

 awk -F, 'NF-1>4{for(i=1;i<NF;i++){if(i==4)k=k$i"||";else k=k$i","} print k$NF}' filename
awk-F,'NF-1>4{for(i=1;i与GNU-awk:

GNU awk用于:


我也有,但它失败了,因为当计数等于4时,它将用
|
替换第4个
,而OP只希望在计数大于4时替换它。@EdMorton说得很好。我再次阅读了问题,注意到他没有指定如果计数正好是4,应该发生什么,所以我支持这个答案il他澄清了他的问题。我也有,但它失败了,因为当计数等于4时,它将用
|
替换第4个
,而OP只希望在计数大于4时替换它。@EdMorton说得很好。我再次阅读了问题,注意到他没有指定如果计数正好是4,该怎么办,所以我坚持这个答案,直到他澄清他的问题。如果计数正好是4,会发生什么?你只指定了>4和@ex bart,我已经更新了我的question@Marjer不要更新您的问题。如果问题不同,请询问其他问题。到目前为止,这些问题是免费的。如果计数正好为4,会发生什么?您只指定了>4和@ex bart,i更新了我的question@Marjer不要更新你的问题。如果问题不同,请问不同的问题。到目前为止,它们是免费的。谢谢@Ed Morton,我已经更新了我的问题例外输出:12,34,56,47 | | | 56,34,56,78 | | 90,12,12,34 | | 45谢谢@Ed Morton,我已经更新了我的问题例外输出:12,34,56,56,78 | | | 90,12,12,34,34 | | |谢谢@anubha弗吉尼亚州,我更新了我的问题。例外输出:12,34,56,47 | 56,34,56,78 | 90,12,12,34 | 45谢谢@anubhava,我更新了我的问题。例外输出:12,34,56,47 | 56,34,56,78 | 90,12,12,34 | 45
$ echo '12,34,56,47,56,34' | awk -F, 'NF>5{$0=gensub(/,/,"||",4)}1'
12,34,56,47||56,34

$ echo '12,34,56,47,56' | awk -F, 'NF>5{$0=gensub(/,/,"||",4)}1'
12,34,56,47,56