我举一个例子,说明我需要如何处理数据。我有两个用制表符分隔的文本文件。
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
产生预期的制表符分隔格式的输出。OFS="\t"
如果您不希望O / P标签分开,请删除。
就逻辑而言,创建一个包含每列1in2.csv
的值的映射到哈希映射中map[]
,然后从in1.csv
包含$1
的映射中选择包含相同值的那些行并打印行内容。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句