csv - 使用 bash 基于列获取两个 csv 文件之间的差异
问题描述
我有两个 csv 文件a.csv
,b.csv
它们都没有标题,并且一行中的每个值都由\t
.
1 apple
2 banana
3 orange
4 pear
apple 0.89
banana 0.57
cherry 0.34
我想减去这两个文件并得到第二列a.csv
和第一列之间的差异,b.csv
这样a.csv[1] - b.csv[0]
会给我另一个文件c.csv
看起来像
orange
pear
我不想使用 python 和其他编程语言,而是想使用bash 命令来完成此任务,发现这awk
会有所帮助,但不太确定如何编写正确的命令。这是另一个类似的问题,但第二个答案用于awk '{print $2,$6-$13}'
获取值之间的差异而不是出现。
感谢并感谢您的帮助。
解决方案
您可以通过您所指的链接中的史蒂夫的回答轻松地做到这一点,并进行一些调整。不确定其他答案paste
是否可以帮助您解决此问题。
从第二个文件创建一个哈希映射,b.csv
并再次将其与第二列进行比较a.csv
awk -v FS="\t" 'BEGIN { OFS = FS } FNR == NR { unique[$1]; next } !($2 in unique) { print $2 }' b.csv a.csv
要将输出重定向到新文件,> c.csv
请在上一个命令的末尾追加。
将字段分隔符(输入和输出)设置\t
为读取制表符分隔的文件。
- 如果您必须对多个文件执行操作,这
FNR == NR { action; } { action } f1 f2
是您在许多命令中发现的通用结构。在提供的第一个文件参数上执行awk
之后的块,并且在第二个文件参数上运行下一个块。FNR == NR
{..}
- 该部分
unique[$1]; next
创建一个哈希映射unique
,其中键作为文件第一列中的值b.csv
。内的部分{..}
针对文件中的所有列运行。 - 在这个文件被完全处理之后,在下一个文件上
a.csv
,我们这样做!($2 in unique)
意味着,标记那些$2
在第二个文件中不是unique
从第一个文件生成的哈希映射中的键的一部分的行。 - 在这些行上仅打印第二列名称
{ print $2 }
推荐阅读
- c++ - 初始化 std::unordered_map 类型的 std::shared_ptr 时编译错误
- asp.net-mvc - 我可以在 VS2019 的 BeforePublish 事件中更改 webconfig 文件中的 connectionString 文本吗?
- python-3.x - 'pygame.Surface' 对象没有属性 'draw'
- bash - 如何拆分 ls -l 的输出以正确的格式显示
- python - 神经网络正则化器 L1 和 L2
- python - 如果列表不存在,附加值或创建并插入?
- c# - Visual Studio 中的 Crystal Reports x86 + OLEDB x64
- karate - 空手道 - 用 if 条件替换值
- json - Powershell export-csv 显示 System.Object[],"System.Object[]"
- excel - 对象_worksheet的方法范围失败-但当我点击“运行子(F5)”时有效