Linux 如何在bash中使用awk编写条件来转置文件?

Linux 如何在bash中使用awk编写条件来转置文件?,linux,shell,awk,scripting,transpose,Linux,Shell,Awk,Scripting,Transpose,我正在尝试编写代码,以便在bash中转置给定的文件。假设文件“file.txt”的格式如下: name age alice 21 ryan 30 name alice ryan age 21 30 我们必须将文件转换为以下格式: name age alice 21 ryan 30 name alice ryan age 21 30 对于这个问题,我找到了以下解决方案: awk '{for(i=0;++i<=NF;)a[i]=a[i]?a[i] FS $i:$i}END{for(i=

我正在尝试编写代码,以便在bash中转置给定的文件。假设文件“file.txt”的格式如下:

name age
alice 21
ryan 30
name alice ryan
age 21 30
我们必须将文件转换为以下格式:

name age
alice 21
ryan 30
name alice ryan
age 21 30
对于这个问题,我找到了以下解决方案:

awk '{for(i=0;++i<=NF;)a[i]=a[i]?a[i] FS $i:$i}END{for(i=0;i++<NF;)print a[i]}' file.txt
a[i]指的是什么?这种情况如何导致文件转置?

这是三值运算符

如果使用if语句,则更易于阅读:

if (a[i]) {
    a[i]=a[i] FS $i # concatenation
} else {
    a[i]=$i
}

如果这对你有帮助的话,请你详细解释一下

awk '                               ##Starting awk program from here.
{                                   ##Starting main BLOCK from here.
  for(i=0;++i<=NF;){                ##Starting a for loop whioh starts from i=1 to till value of NF(number of fields) in current line.
    a[i]=a[i]?a[i] FS $i:$i         ##Creating an array a whose index is variable i value and its keep concatenating its own value with same field number.
  }                                 ##Closing BLOCK for, for loop here.
}                                   ##Closing main BLOCK here.
END{                                ##Starting END block for this awk program here.
  for(i=0;i++<NF;){                 ##Starting a for loop which runs from i=0 to value of NF.
    print a[i]                      ##Printing value of array a whose index is variable i.
  }                                 ##Closing BLOCK for, for loop here.
}                                   ##Closing BLOCK for END block of this awk program here.
' Input_file                        ##Mentioning Input_file name here.
现在我们要做的是,创建一个具有相同索引的数组,这样直到最后一行的值将是
| |
具有索引
1
@@@code>具有索引
2
现在我们在
END
部分所做的是开始一个从
1
NF
的for循环

因此,首先将打印索引为
1
的所有值,然后打印索引为
2
的所有值,依此类推。。。。像这样:

| | |
@ @ @

由于我们只是将所有列值连接到同一个索引数组中,并最终使用for循环将它们与列号一起打印,因此它成为原始数据的转置。

这种连接如何帮助转置?a[i]=a[i]?a[i]FS$i:$i##创建一个数组a,其索引是变量i值,并且它将自己的值与相同的字段号连接起来:为什么我们需要将元素值连接到字段号以进行转置?@shnboom,欢迎您,很高兴它帮助了您,在这个伟大的网站上欢呼并愉快地学习。
| | |
@ @ @