我有两个文件;我想加入他们。
$cat t1
1 1.2
2 2.2
$cat t2
1
2
1
我希望输出
$cat joind.txt
1 1.2
2 2.2
1 1.2
但是当我使用join
命令时,第三行不会出现在输出中。
答案 0 :(得分:4)
简单的awk
就足够了:
awk 'FNR==NR{a[$1]=$2;next} {print $1, a[$1]}' t1 t2
1 1.2
2 2.2
1 1.2
<强>解体:强>
NR == FNR { # While processing the first file
a[$1] = $2 # store the second field by the first
next # move to next record in 1st file
}
{ # while processing the second file
print $1, a[$1] # print $1 and the remembered
# value from the first file.
}
答案 1 :(得分:3)
join
要求对两个文件进行排序。如果您先对它们进行排序,那么您将获得所有输出
$ sort t1 > t1.sorted
$ sort t2 > t2.sorted
$ join -j1 -o 1.1,1.2 t1.sorted t2.sorted
1 1.2
1 1.2
2 2.2
没有排序:
$ join -j1 -o 1.1,1.2 t1 t2
1 1.2
2 2.2
这假定您的输入顺序不需要保留;如果他们这样做,您将需要一个自定义脚本,就像其他答案一样。
答案 2 :(得分:1)
如下所示:
$ while IFS= read -r line; do grep -m 1 "^$line" t1; done <t2
1 1.2
2 2.2
1 1.2
答案 3 :(得分:1)
如果我了解您希望将t1
的第一列与t2
中的值匹配。因此,t1
是一个词典,t2
是所需的键。
如果是这样,你可以使用:
$ cat t2 | xargs -n1 -I{} grep -P "^\Q{}\E\s+" t1
它是如何运作的?
xargs
将为grep
的每个条目-n1
执行命令t2
。 -I{}
允许我将值放在我想要的位置。
然后我使用正则表达式执行与字典中所需值匹配的grep
。
^ # Any line that begin with
\Q # Quote the value (in case we have special chars inside it)
{} # The corresponding value matched by xargs
\E # End of quoting
\s+ # Followed by one or more spaces (alternatively we can use `\b`)
.* # Followed by anything (optional)
t1 # Inside the file `t1`
或者你可以玩Perl:)
cat t2 | perl -e '$_ = qx{cat $ARGV[0]}; \
$t1{$1} = $2 while(/^(\w+)\s+(.*)/gm); \
print "$t1{$_}\n" for (split "\n", do{local $/, <STDIN>})' t1
答案 4 :(得分:0)
您可以尝试AWK
:
awk 'NR==FNR{a[$1]=$2}NR>FNR{print $1,a[$1]}' t1 t2