我有一个目录,其中有许多具有以下 3 种模式的 csv 文件:STRUCTURED_PROD、STRUCTURED_NON_PROD 和 UNSTRUCTURED。我想将所有这些合并到 3 个单独的文件中,只有一个标头。正常的猫方法也是复制标题,所以我尝试如下:
非结构化的顶部有一条额外的垃圾线。下面是我的脚本,但仅使用 6 个文件运行就需要很长时间。
File_Path=/Source/temp/
for Files in $File_Path/*.csv; do
if [[ "$Files" = *STRUCTURED_PROD* ]]; then
#cat *STRUCTURED_PROD.csv > Merged_STRUCTURED_PROD.csv
awk '(NR == 1) || (FNR > 1)' *STRUCTURED_PROD.csv > Merged_STRUCTURED_PROD.csv
fi
if [[ "$Files" = *STRUCTURED_NON_PROD* ]]; then
awk '(NR == 1) || (FNR > 1)' *STRUCTURED_NON_PROD.csv > Merged_STRUCTURED_NON_PROD.csv
fi
if [[ "$Files" = *_UNSTRUCTURED* ]]; then
awk 'FNR>2 || NR==2' *_UNSTRUCTURED.csv > Merged_UNSTRUCTURED.csv
fi
done
早些时候我尝试过这个而不是 awk,但它复制了标头两次:
cat *STRUCTURED_PROD.csv > Merged_STRUCTURED_PROD.csv
答案1
您通过 for 循环多次调用合并命令。
但你只需要调用一次。放弃 for 循环,只需执行
File_Path=/Source/temp/
awk '(NR == 1) || (FNR > 1)' ${File_Path}*STRUCTURED_PROD.csv > Merged_STRUCTURED_PROD.csv
awk '(NR == 1) || (FNR > 1)' ${File_Path}*STRUCTURED_NON_PROD.csv > Merged_STRUCTURED_NON_PROD.csv
awk 'FNR>2 || NR==2' ${File_Path}*_UNSTRUCTURED.csv > Merged_UNSTRUCTURED.csv