2

入力ファイル1

A1  123 AA
B1  123 BB
C2  44  CC1
D1  12  DD1
E1  11  EE1

入力ファイル2

A   sad21   1
DD1 124f2   2
CC  123tges 3
BB  124sdf  4
AA  1asrf   5

出力ファイル

A1  123 AA  1asrf   5
B1  123 BB  124sdf  4
D1  12  DD1 124f2   2

出力ファイルの作成

入力ファイル1の3列目と入力ファイル2の1列目をチェックします。

一致する場合は、出力ファイルに出力します。

ノート :

ファイルはソートされていません

私は試した :

join -t, A B | awk -F "\t"  'BEGIN{OFS="\t"} {if ($3==$4) print $1,$2,$3,$4,$6}'

ただし、ファイルがソートされていないため、これは機能しません。したがって、条件($ 3 == $ 4)は常に機能するとは限りません。助けてください 。

4

5 に答える 5

2
nawk 'FNR==NR{a[$3]=$0;next}{if($1 in a){p=$1;$1="";print a[p],$0}}' file1 file2

以下でテスト済み:

> cat file1
A1      123     AA
B1      123     BB
C2      44      CC1
D1      12      DD1
E1      11      EE1
> cat file2
A       sad21   1
DD1     124f2   2
CC      123tges 3
BB      124sdf  4
AA      1asrf   5
> awk 'FNR==NR{a[$3]=$0;next}{if($1 in a){p=$1;$1="";print a[p],$0}}' file1 file2
D1      12      DD1  124f2 2
B1      123     BB  124sdf 4
A1      123     AA  1asrf 5
>
于 2012-09-12T08:57:50.910 に答える
2

を使用できますjoinが、最初にキー フィールドでソートしjoin、最初のファイルのキーが列 3 ( -1 3)であることを伝える必要があります。

join -1 3 <(sort -k 3,3 file1) <(sort file2)

正しいフィールド、出力を取得します(column -t出力フォーマット用):

AA   A1  123  1asrf   5
BB   B1  123  124sdf  4
DD1  D1  12   124f2   2

質問に記載されているのと同じ列の順序を取得するには、出力形式を指定する必要があります。

join -1 3 -o 1.1,1.2,1.3,2.2,2.3 <(sort -k 3,3 file1) <(sort file2)

つまり、ファイル 1 のフィールド 1 から 3、次にファイル 2 のフィールド 2 と 3 です。出力 (再びcolumn -t):

A1  123  AA   1asrf   5
B1  123  BB   124sdf  4
D1  12   DD1  124f2   2
于 2012-09-12T08:40:06.167 に答える
1

を使用した片道awk

awk 'BEGIN { FS=OFS="\t" } FNR==NR { array[$1]=$2 OFS $3; next } { if ($3 in array) print $0, array[$3] }' file2.txt file1.txt

結果:

A1  123 AA  1asrf   5
B1  123 BB  124sdf  4
D1  12  DD1 124f2   2
于 2012-09-12T06:15:07.167 に答える
1
perl -F'/\t/' -anle 'BEGIN{$f=1}if($f==1){$H{$F[2]}=$_;$f++ if eof}else{$l=$H{$F[0]};print join("\t",$l,@F[1..$#F]) if defined$l}' f1.txt f2.txt

またはそれより短い

perl -F'/\t/' -anle'$f?($l=$H{$F[0]})&&print(join"\t",$l,@F[1..$#F]):($H{$F[2]}=$_);eof&&$f++' f1.txt f2.txt
于 2012-09-12T07:53:12.097 に答える
1

これはうまくいくかもしれません(GNU sed):

sed 's|\(\S*\)\(.*\)|/\\s\1$/s/$/\2/p|' file2 | sed -nf - file1
于 2012-09-12T10:06:06.297 に答える