将每一列移动到文件末尾 bash

将每一列移动到文件末尾 bash

我有一个包含不确定数量的列的文件,由字符分隔~,如下所示:

1~5~4
toast~8~test
3~9~8

我如何循环遍历每一列,并将其移动到底部?我希望输出是:

1
toast
3
5
8
9
4
test
8

我知道您需要确定列数,但我不太确定如何执行此操作,然后循环并移动它们。

答案1

您可以使用rs(reshape) 效用

  1. 首先转置,用作~列分隔符
  2. 然后重塑为单列

前任。

$ rs -c~ -T < file | rs 0 1
1
toast
3
5
8
9
4
test
8

或者,使用 Awk:

$ awk -F~ '
    {for (i=1;i<=NF;i++) a[i] = a[i] == "" ? $i : a[i] "\n" $i} 
    END {for (i in a) print a[i]}
  ' file
1
toast
3
5
8
9
4
test
8

答案2

$ perl -F'~' -lane '
    $A[$_][$.-1] = $F[$_] for 0 .. $#F;}{
    print join $/, @{$A[$_]} for 0 .. $#A;
' input.file

将列收集并存储在多维数组中,以便第一个索引引用列号,第二个索引引用行号。然后在最后循环 col num 并打印由换行符分隔的每个数组元素。

相关内容