python - 在 bash 中将数据粘贴在一起

标签 python bash shell awk sed

我将向您展示我需要如何处理数据的示例。我有两个用制表符分隔的文本文件。

cat in1.tsv

111 A B C
111 D E F
111 G H I
222 A B C
333 A B C
333 D E F

这个表可以有大约几千行。列数小于 100。第一列可以有重复的值(如 111 和 333)。

cat in2.tsv

111 a b c 
222 a b c 
333 d e f

在此文件中,值仅在第 1 列中出现一次。我需要根据第一列匹配合并这两个文件。

cat output.tsv

111 A B C 111 a b c
111 D E F 111 a b c
111 G H I 111 a b c
222 A B C 222 a b c 
333 A B C 333 d e f
333 D E F 333 d e f 

如果矩阵的大小相同,我的解决方案有效:

paste  <(sort in1.tsv) <(sort in2.tsv) > output.tsv

我很感激 awk、bash 或其他可以快速处理大量行的程序的帮助。

最佳答案

Awk 助您一臂之力!

awk 'BEGIN{FS=OFS="\t"}FNR==NR{for(i=2;i<=NF;i++) map[$1]=(map[$1] FS $i); next}$1 in map{print $0,$1,map[$1]}' in2.tsv in1.tsv

按照您的预期生成制表符分隔格式的输出。如果您不希望 o/p 制表符分隔,请删除 OFS="\t"

就逻辑而言,创建一个包含 in2.csv 上每列 1 的值的映射到 HashMap map[] 中,然后在 中in1.csv 从形成的 map 中选择那些包含 $1 的行并打印行内容。

关于python - 在 bash 中将数据粘贴在一起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44543982/

相关文章:

python - 如何在for循环中创建数组?

bash - 如何从 Chrome 复制 cookie?

python - grep 管道 python 等效项

perl - 是否可以编写一个比 Perl 中的等效脚本更快的 shell 脚本?

bash - 如何将base64编码的内容传递给sed?

python - 如何在特定条件下读取txt

python - 如何根据特定标准对列表进行排序

python - 使用牛津项目的情感 API

bash - 提取匹配 "foo"的文件的最后 10 行

bash - shell脚本中的 "for i"和 "for i in 1 2 3 4"有什么区别?