*.csv
考虑某个文件夹中存在大量 CSV 文件 ( )。它们都有完全相同的标头。
如何有效地将它们全部连接到具有相同标头的单个 CSV 文件中?
我找到了许多解决类似但更具体的问题的解决方案。
当前的awk
解决方案不起作用。
$ cat concat_my_csv_files.sh
#!/usr/bin/env zsh
awk '
FNR==1 && NR!=1 { while (/^<header>/) getline; }
1 {print}
' $1/*.csv > $2
$ ./concat_my_csv_files /some/path/to/csv/files/ full_join.csv
当我做:
grep -F column_A full_join.csv
我看到好几行都有它。
答案1
awk '
NR == 1 {print}
FNR == 1 {next}
{print}
' *.csv
该NR
变量是所有输入的记录数。
该FNR
变量仅是当前文件的记录号。
这将打印 awk 看到的第一行(第一个文件的标题),然后将跳过每个文件的第一行,打印所有其他行。
答案2
基本上你想要“head -n 1 firstorany.csv; tail -n +2 *.csv”。
set -- *.csv
head -n 1 "$1"
tail -n +2 "$@"
如果 sh 脚本中使用 *.csv 作为参数,请省略第一行。