cat - 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 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'
推荐阅读
- python-3.x - 如何将 API 数据保存到 pandas DataFrame 中?
- javascript - 如何在 JavaScript 中获得具有给定替换的字符串的所有组合?
- python - 如何从另一个 python 文件运行 python 文件?(无需等待它关闭)
- laravel - 如何将所有网站请求重定向到 laravel 中的 https://www?
- azure - 将 Android.Xamarin 项目从本地机器移动到 Microsoft Azure
- c# - Azure .NET Core Appservice 由于异步调用而锁定发送 502.3
- json - Jq 解析错误:第 1 行第 9 列的数字文字无效
- blazor - 如何在 blazor 中动态显示图像标签?
- python - pandas plot(kind='line') 创建散点图
- c - 如何在通过 execl 打开的 bin/sh 上调用 shell 命令