首页 > 解决方案 > cat 命令合并两个 *.txt 缺少列 mac osx

问题描述

我喜欢cat在mac osx下用命令加入几个*.txt文件。

我的第一个file1.txt看起来像:

a;b;c;d
1;2;3;4

第二file2.txt

a;b
5;6
7;8

我想要的是:

a;b;c;d
1;2;3;4
5;6;;
7;8;;

我的问题:我可以跳过输出文件中第二个文件的标题吗?cat 如何处理丢失的列?写NaN?

也许这个命令可以做到?

head -1 file1.txt > all.txt;
tail -n +2 -q file*.txt >> all.txt

标签: cat

解决方案


我认为cat单独的命令不会处理删除标题或标记任何丢失的列,因为它所做的只是连接文件。但是,如果您知道可能的最大列数,则可以执行以下操作:

cat file1.txt <( tail -n+2 file2.txt ) | gawk -F';' -v OFS=';' '{NF=4}1'

其中 NF=4 是最高的列数(在您的示例中为 4)。上面的命令使用子命令的输出作为输入(运算符 <( ) )将 file1.txt 与无标题版本的 file2.txt 连接起来。对于要连接的每个文件,您可以多次使用 <( )。最后的命令 gawk 改编自这个答案) 并且它正在为您填充列分隔符。

(注意:brew install gawk如果没有找到 gawk 则使用;Mac OS X 的 awk 不起作用)

如果没有第一个标题不会打扰您并且您不想使用 cat,您可以这样做:

gawk -F';' -v OFS=';' '{NF=4}1' file*.txt | egrep -v '^a;b'


推荐阅读