我有几个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
非常感谢您的建议!
答案 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
。