2

私は2つのファイルを持っています:

 File1

 12    abc
 34    cde
 42    dfg
 11    df
 9     e   


 File2

 23    abc
 24    gjr
 12    dfg
 8     df

次のような出力のために、ファイルを列ごとにマージします (列 2 が同じ場合)。

  File1  File2
   12    23    abc
   42    12    dfg
   11    8     df
   34    NA    cde
   9     NA    e
   NA    24    gjr

これどうやってするの?

私はこのように試しました:

 cat File* >> tmp; sort tmp | uniq -c | awk '{print $2}' > column2; for i in
 $(cat column2); do grep -w "$i" File*

しかし、これは私が立ち往生している場所です...
grepingした後、列ごとにファイルを結合し、値が欠落している場所にNAを書き込む方法がわかりません。

誰かがこれで私を助けてくれることを願っています。

4

1 に答える 1

13

bashas で実行されている 3.2でテストしていたのでsh(as のプロセス置換はありませんsh)、2 つの一時ファイルを使用して、データを で使用できるようにしましたjoin

$ sort -k2b File2 > f2.sort
$ sort -k2b File1 > f1.sort
$ cat f1.sort
12    abc
34    cde
11    df
42    dfg
9     e  
$ cat f2.sort
23    abc
8     df
12    dfg
24    gjr
$ join -1 2 -2 2 -o 1.1,2.1,0 -a 1 -a 2 -e NA f1.sort f2.sort
12 23 abc
34 NA cde
11 8 df
42 12 dfg
9 NA e
NA 24 gjr
$

プロセス置換を使用すると、次のように記述できます。

join -1 2 -2 2 -o 1.1,2.1,0 -a 1 -a 2 -e NA <(sort -k2b File1) <(sort -k2b File2)

データを別の形式にしたい場合は、 を使用awkして出力を後処理します。

$ join -1 2 -2 2 -o 1.1,2.1,0 -a 1 -a 2 -e NA f1.sort f2.sort |
> awk '{ printf "%-5s %-5s %s\n", $1, $2, $3 }'
12    23    abc
34    NA    cde
11    8     df
42    12    dfg
9     NA    e
NA    24    gjr
$
于 2013-01-25T08:07:43.243 に答える