我收到一个csv文件,它总是包含相同数量的行,但永远不会包含相同数量的列(有时我有3列,有时它可以达到12或更多!
该文件如下所示:
cat file.csv
John-;Paul-;Lisa-;Tim-
21-;44-;25-;33-
London-;Paris-;Chicago-;Roma-
Student;Teacher;Engineer;Cook
Funny-;Clever-;Sincere-;Passionate-
我希望在文本文件中以精确的顺序写入每列的内容,同时尊重每行一列,例如:
John-London-21-Funny-Student
Paul-Paris-44-Clever-Teacher
Lisa-Chicago-25-Sincer-Engineer
Tim-Roma-33-Passionate-Cook
我写了这个 bash 脚本:
cat file.csv | awk -F";" '{ print $1 }' > temp1
declare -a lines
readarray -t lines <temp1
echo -n "${lines[0]}" > result.txt
echo -n "${lines[2]}" >> result.txt
echo -n "${lines[1]}" >> result.txt
echo -n "${lines[4]}" >> result.txt
echo -n "${lines[3]}" >> result.txt
结果是正确的,因为我得到这个:
cat result.txt
John-London-21-Student
。但我只得到第一次出现,我不知道如何循环 awk 命令并递增它以读取文件的所有列。
你有什么想法吗?
如果先转置数据,则数据更易于处理。我使用了GNUdatamash
,但你可以这样做 如果需要,可以使用awk
(例如,请参阅在 Bash 中转置文件的有效方法(:
$ datamash -t';' transpose < file.csv | awk -F';' '{ print $1 $3 $2 $5 $4 }'
John-London-21-Funny-Student
Paul-Paris-44-Clever-Teacher
Lisa-Chicago-25-Sincere-Engineer
Tim-Roma-33-Passionate-Cook
awk -F ';' '{ for (i = 1; i <= NF; i++) token[NR, i] = $i }
END { for (i = 1; i <= NF; i++)
print token[1, i] token[3, i] token[2, i] token[5, i] token[4, i] }' file.csv