如何用awk或Shell脚本合并制表符分隔文件并排除次文件表头
用awk或Shell脚本合并两个同结构制表符文件的解决方案
这需求用awk或者简单的Shell组合命令就能轻松搞定,完全不用复杂的脚本,下面给你两种靠谱的方法:
方法一:用awk处理(推荐,适合复杂场景或大文件)
直接一行命令搞定,逻辑清晰还高效:
awk 'NR == FNR {print; next} FNR > 1' file.1.txt file.2.txt > merged.txt
命令解释:
NR == FNR:NR是awk当前处理的总行数,FNR是当前处理的当前文件内的行号。当处理第一个文件file.1.txt时,这两个值相等,所以执行print输出每一行,然后next跳过后续逻辑,确保第一个文件的所有行(包括表头)都被完整输出。FNR > 1:当处理第二个文件file.2.txt时,只输出行号大于1的内容——也就是跳过它的表头行,只保留数据行。- 最后把结果重定向到
merged.txt,就是你要的合并文件。
方法二:用Shell基础命令组合(更简洁,适合简单场景)
如果不想用awk,用cat和tail的组合也能快速实现:
cat file.1.txt <(tail -n +2 file.2.txt) > merged.txt
命令解释:
cat file.1.txt:先完整输出第一个文件的所有内容(包括表头)。<(tail -n +2 file.2.txt):用进程替换的方式,输出file.2.txt从第2行开始的所有内容(跳过表头)。- 两者的输出合并后重定向到
merged.txt,效果和awk方法完全一致。
额外验证小技巧
合并后可以验证所有行的列数是否都是168(确保格式没出问题):
awk -F'\t' '{print NF}' merged.txt | sort -u
如果输出只有168,说明所有行的列数都符合要求,没问题。
内容的提问来源于stack exchange,提问作者RonicK
相关产品推荐
相关产品推荐

