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

时间:2015-08-19 13:36:19

标签: 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.但无法用||

替换第4个逗号

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

更新

我想在每次第4次逗号后用||符号替换逗号。对不起,感到困惑。

预期输出:

12,34,56,47||56,34,56,78||90,12,12,34||45

5 个答案:

答案 0 :(得分:4)

使用gensub()的GNU awk:

$ 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

答案 1 :(得分:3)

$ echo 12,34,56,47,56,34,56,78,90,12,12,34,45 | sed 's/,/||/4'
12,34,56,47||56,34,56,78,90,12,12,34,45
$ echo 12,34,56,47 | sed 's/,/||/4'
12,34,56,47

应该适用于任何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允许组合,但在这种情况下它不能做我们想要的。所以你必须在正则表达式中拼出它。

答案 2 :(得分:1)

使用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

答案 3 :(得分:0)

  

如果计数大于4我想用第4个逗号(,)代替   ||

试试这行(gnu sed):

sed -r '/([^,]*,){4}.*,/s/,/||/4' file

试验:

kent$  echo ",,,,,"|sed -r '/([^,]*,){4}.*,/s/,/||/4'
,,,||,

kent$  echo ",,,,"|sed -r '/([^,]*,){4}.*,/s/,/||/4'    
,,,,

kent$  echo ",,,"|sed -r '/([^,]*,){4}.*,/s/,/||/4'     
,,,

答案 4 :(得分:0)

使用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