Linux 如何在bash中使用awk编写条件来转置文件?
我正在尝试编写代码,以便在bash中转置给定的文件。假设文件“file.txt”的格式如下: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=
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,欢迎您,很高兴它帮助了您,在这个伟大的网站上欢呼并愉快地学习。
| | |
@ @ @