鉴于这一行:
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
答案 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