如何在bash中一个接一个地打印列?

onc*_*nce 2 bash awk cut sed multiple-columns

例如,是否有更好的方法可以将两列或更多列打印到一列中

输入文件

AAA    111
BBB    222
CCC    333
Run Code Online (Sandbox Code Playgroud)

输出:

AAA
BBB
CCC
111
222
333
Run Code Online (Sandbox Code Playgroud)

我只能想到:

cut -f1 input.file >output.file;cut -f2 input.file >>output.file
Run Code Online (Sandbox Code Playgroud)

但是,如果有很多列,或者我想将输出传递给其他命令,那就不好了sort.

还有其他建议吗?非常感谢你!

717*_*71u 6

awk

awk '{if(maxc<NF)maxc=NF;
      for(i=1;i<=NF;i++){(a[i]!=""?a[i]=a[i]RS$i:a[i]=$i)}
      }
     END{
      for(i=1;i<=maxc;i++)print a[i]
     }' input.file
Run Code Online (Sandbox Code Playgroud)


fed*_*qui 5

您可以使用GNU awk 数组阵列来存储所有数据并在以后打印它.

如果列数是常量,则适用于任何数量的列:

gawk '{for (i=1; i<=NF; i++)            # loop over columns
           data[i][NR]=$i               # store in data[column][line]
      }
      END {for (i=1;i<=NR;i++)          # loop over lines
                for (j=1;j<=NF;j++)     # loop over columns
                     print data[i][j]   # print the given field
      }' file
Run Code Online (Sandbox Code Playgroud)

注意NR表示记录数(即此处的行数),NF表示字段数(即给定行中的字段数).

如果列数更改了行,那么我们应该使用另一个数组,在这种情况下,存储每行的列数.但是在这个问题上我没有看到这个请求,所以我现在就离开了.

查看包含三列的示例:

$ cat a
AAA    111  123
BBB    222  234
CCC    333  345
$ gawk '{for (i=1; i<=NF; i++) data[i][NR]=$i} END {for (i=1;i<=NR;i++) for (j=1;j<=NF;j++) print data[i][j]}' a
AAA
BBB
CCC
111
222
333
123
234
345
Run Code Online (Sandbox Code Playgroud)

如果列数不是常量,则使用数组存储每行的列数有助于跟踪它:

$ cat sc.wk 
{for (i=1; i<=NF; i++)
       data[i][NR]=$i
 columns[NR]=NF
}
END {for (i=1;i<=NR;i++)
            for (j=1;j<=NF;j++)
                 print (i<=columns[j] ? data[i][j] : "-")
}
$ cat a
AAA    111  123
BBB    222
CCC    333  345
$ awk -f sc.wk a
AAA
BBB
CCC
111
222
333
123
-
345
Run Code Online (Sandbox Code Playgroud)

  • 嘿,有什么原因可以进行下调?有什么我错过的吗? (2认同)