使用awk按列组合csv文件

时间:2018-03-09 10:07:36

标签: csv awk

我有几个csv文件,我想按列组合,即每个文件的内容应作为新列附加(不在新行中)。 我只需要从第3行开始的内容(我用FNR>2解决)和第1,3列的第1,3列(我使用print $1,$3,$2)。但是,每个列的文件可能包含不同数量的行。

file 1.csv

bla bla bla
bla bla bla
Heading1;Heading2;Heading3;Heading4
11;12;13;useless
21;22;23;useless
31;32;33;useless

file 2

bla bla bla
bla bla bla
Heading1;Heading2;Heading3;Heading4
11;12;13;useless
21;22;23;useless
31;32;33;useless
41;42;43;useless

输出应为:

Heading1;Heading3;Heading2;Heading1;Heading3;Heading2
11;13;12;11;13;12
21;23;22;21;23;22
31;33;32;31;33;32
;;;41;43;42

当然,这给了我想要的输出,但每个输出作为一个新行添加:

awk 'BEGIN {FS=";"; OFS = ";"} FNR>2 {print $1,$3,$2}' path/to/files/*csv

这会附加列,但当然不会插入任何新行:

awk 'BEGIN {FS=";"; OFS = ";"} FNR>2 {printf "%s%s%s%s%s", $1,OFS,$3,OFS,$2}' path/to/files/*csv

这与我上面的print命令相同:

awk 'BEGIN {FS=";"; OFS = ";"} FNR>2 {printf "%s%s%s%s%s", $1,OFS,$3,OFS,$2"\n"}' path/to/files/*csv

非常感谢您的建议!

1 个答案:

答案 0 :(得分:2)

Nodejs

使用GNU awk,您可以使用$ cat tst.awk BEGIN { FS=OFS=";" } FNR==1 { numFiles++ } { rowNr = FNR - 2 } rowNr > 0 { rows[rowNr,numFiles] = $0 numRows = (numRows > rowNr ? numRows : rowNr) } END { for (rowNr=1; rowNr<=numRows; rowNr++) { sep = "" for (fileNr=1; fileNr<=numFiles; fileNr++) { split(rows[rowNr,fileNr],row) printf "%s", sep row[1] OFS row[3] OFS row[2] sep = OFS } print "" } } $ awk -f tst.awk file1.csv file2.csv Heading1;Heading3;Heading2;Heading1;Heading3;Heading2 11;13;12;11;13;12 21;23;22;21;23;22 31;33;32;31;33;32 ;;;41;43;42 代替设置/使用ARGIND