以精确的顺序选择每列的内容,同时遵守每行一列(CSV / AWK / BASH)

  • 本文关键字:BASH 一列 CSV AWK 选择 顺序 bash csv awk
  • 更新时间 :
  • 英文 :


我收到一个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

最新更新