我有两个带有制表符分隔值的文件,如下所示:
文件1:
A 1
B 3
C 1
D 4
文件2:
E 1
B 3
C 2
A 9
我想找到文件 1 和文件 2 之间第 1 列中的字符串相同的行,然后获取相应的值。所需的输出是一个如下所示的单个文件:
B 3 3
C 1 2
A 1 9
这可以用 Unix one-liner 来完成吗?
答案1
join
如果结果中的行排序不相关,GNU coreutils 包含的命令可以完全满足您的需求:
join <(sort file1) <(sort file2)
A 1 9
B 3 3
C 1 2
如果您想要恢复选项卡,请执行以下操作:
join <(sort file1) <(sort file2) | tr ' ' '\t'
A 1 9
B 3 3
C 1 2
或者使用t
选项join
.
(<()
又名进程替换,需要 ksh93(该功能源自何处)、bash 或 zsh)
答案2
ire@localhost: sort -k1 file2 | join file1 -
A 1 9
B 3 3
C 1 2
如果您想在输出中使用制表符,请执行以下操作
sort -k1 file2 | join -t " " file1 -
您可以通过按 CTRL-V 在引号内构建选项卡<tab>
。
答案3
如果您不想对输出进行排序,而是希望与 file2 具有相同的顺序,则 awk 是一个很好的工具:
awk '
NR == FNR {val[$1]=$2; next}
$1 in val {print $1, val[$1], $2}
' file1 file2