在Linux上加入两个文件

时间:2015-06-28 09:06:58

标签: linux bash join

我有两个文件;我想加入他们。

$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命令时,第三行不会出现在输出中。

5 个答案:

答案 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