我有输出线我想管道输入命令来改变它的最终形式。
我正在尝试查看每一行,并确定具有特定字符%
的最大数量的人。然后我想确保所有行都具有相同数量的%
,因此您只需在行尾添加许多%
。管道输入的示例输入:
1 2 3 4
1 2 %x 4
%r %c %s 4
1 2 3 4
输出:
1 2 3 4 %z %z %z
1 2 %x 4 %z %z
%r %c %s 4
1 2 3 4 %z %z %z
只有最大先验并将字符串填充到该数字也是可以接受的。我想如果某个行的字符数超过最大值,这会破坏。
答案 0 :(得分:1)
您可以使用awk
将输入字段分隔符设为%
来解决此问题:
awk -F% -v n=3 '{rn = n+1 -NF; for (i=1; i<=rn; i++) $0 = $0 OFS "%z"} 1' file
1 2 3 4 %z %z %z
1 2 %x 4 %z %z
%r %c %s 4
1 2 3 4 %z %z %z
答案 1 :(得分:1)
awk 解决方案(针对任意数量的%
次出现):
awk 'NR==FNR{ r = gsub("%","",$0); if(r>max) max=r; a[NR]=r; next }
a[FNR] < max{ for(i=max-a[FNR];i--;) $0=$0" %z" }1' file file
r
- %
字符的替换次数
max
- 最终将包含所有行的最大%
次出现次数
输出:
1 2 3 4 %z %z %z
1 2 %x 4 %z %z
%r %c %s 4
1 2 3 4 %z %z %z
答案 2 :(得分:1)
perl对此有好处:
perl -lne '
push @lines, $_; $n = tr/%/%/; push @n, $n; $max = $n if $n > $max
} END {
print $lines[$_] . " %z" x ($max - $n[$_]) for (0 .. $#lines);
' file
答案 3 :(得分:1)
$ cat file |
awk -F'%' '
{ maxNF = (maxNF>NF ? maxNF : NF); a[NR]=$0; nf[NR]=NF }
END {
for (i=1; i<=NR; i++) {
printf "%s", a[i]
for (j=nf[i]+1; j<=maxNF; j++) {
printf "%s%sz", OFS, FS
}
print ""
}
}
'
1 2 3 4 %z %z %z
1 2 %x 4 %z %z
%r %c %s 4
1 2 3 4 %z %z %z
cat file |
显然仅用于演示管道输入,因为您说I would like to pipe into commands...