我将向您展示我需要如何处理数据的示例。我有两个用制表符分隔的文本文件。
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/