awk 命令循环

awk 命令循环
awk '{print $1 ,": "  $3}' Src.txt | column -t
awk '{for(x=2;$x;++x) print $1, $x "\n"}'  Src.txt | column -t

这些命令有效,但格式不正确,要么我只能打印第一列和第二列,要么我可以打印第一列,然后打印第二列和第三列,但所需的结果是

column 1 column 2
column 1 column 3
column 1 column 4 .....

例子 :

Col1  a b c
Col2  1 2 3  
col3  x y z

输出

Col1 a
Col2 b
Col3 c

Col1 b
col2 2
Col3 y

Col1 c
Col2 3
Col3 z

也许需要添加适当的循环?

答案1

awk 的工作方式是默认情况下它会遍历每个线文本并将每个以空格分隔的项目拆分为字段,在本例中,我们感兴趣的字段为 $2、$3 和 $4。现在,如果我们可以将每行的每个 $2 字段存储到一个列表中然后打印它会怎么样?这就是数组可以提供帮助的地方。

将 awk 代码的主体视为一个大 while 循环,我们可以将字段 2、3 和 4 分成适当的数组。每行都会填充数组。因此,当我们遍历行时,我们基本上将所有内容排序到列(数组)中。完成后,我们可以通过循环分别打印每个列(数组),同时只需添加文本“Column#”。

$ awk '{ array1[NR]=$2;array2[NR]=$3;array3[NR]=$4} END{for(i=1;i<=NR;i++){print "Column"i" "array1[i]};printf "\n";for(i=1;i<=NR;i++){print "Column"i" "array2[i]}; printf"\n"; for(i=1;i<=NR;i++){print "Column"i" "array3[i] };printf "\n" }' columns.txt           
Column1 a
Column2 1
Column3 x

Column1 b
Column2 2
Column3 y

Column1 c
Column2 3
Column3 z

当然,这么长的一行使用起来有点尴尬(没有 awk 双关语的意思)。我们可以将所有内容放入脚本中:

#!/usr/bin/awk -f

{ array1[NR]=$2;array2[NR]=$3;array3[NR]=$4 } 

END{
  for(i=1;i<=NR;i++){
     print "Column"i" "array1[i]};printf "\n";
   for(i=1;i<=NR;i++){
     print "Column"i" "array2[i]}; printf"\n"; 
   for(i=1;i<=NR;i++){
     print "Column"i" "array3[i] };printf "\n" 
}

调用该脚本columnate.awk,将权限更改为可执行文件,chmod +x columnate.awk并使用任何文本文件作为参数运行它:

$ ./columnate.awk columns.txt                                                                                                                          
Column1 a
Column2 1
Column3 x

Column1 b
Column2 2
Column3 y

Column1 c
Column2 3
Column3 z

相关内容