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