均衡所有行中字符的出现

时间:2017-09-16 11:13:26

标签: bash awk

我有输出线我想管道输入命令来改变它的最终形式。

我正在尝试查看每一行,并确定具有特定字符%的最大数量的人。然后我想确保所有行都具有相同数量的%,因此您只需在行尾添加许多%。管道输入的示例输入:

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

只有最大先验并将字符串填充到该数字也是可以接受的。我想如果某个行的字符数超过最大值,这会破坏。

4 个答案:

答案 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...