3

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

猫のテスト1.txt

1|2|3|4

2|3|4|4

3|4|5|5

猫のテスト2.txt

1|2|4|5

2|3|5|6

3|5|7|7

私の出力は

1|2|3|4|4|5

2|3|4|4|5|6

フィールド 1 と 2 で 2 つのファイルを結合し、ファイル 1 から 1,2,3,4 の値を取得し、ファイル 2 から 3,4 の値を取得するようなものです。

これで私を助けてください?

4

5 に答える 5

4
awk -F\| 'NR == FNR {
  f2[$1, $2] = $3 OFS $4
  next
  }
($1, $2) in f2 {
  print $0, f2[$1, $2]
  }' OFS=\| test2.txt test1.txt
于 2012-11-07T20:36:16.880 に答える
2

でこれをやってみてくださいperl

paste -d '|' file1.txt file2.txt |
    perl -F'\|' -lane '
        print join "|", @F[0..3,6,7] if $F[0] eq $F[4] and $F[1] eq $F[5]
    '

そしてでsh

#!/bin/sh

paste -d '|' test1.txt test2.txt | while IFS='|' read a1 a2 a3 a4 a5 a6 a7 a8; do
    if [ $a1 -eq $a5 -a $a2 -eq $a6 ]; then
        echo "$a1|$a2|$a3|$a4|$a7|$a8"
    fi
done

出力

1|2|3|4|4|5
2|3|4|4|5|6
于 2012-11-07T20:25:53.150 に答える
2

うーん、それはあなたの例でうまくいきます:

 sed 's/|/+/' t1.txt>$$.tmp;sed 's/|/+/' t2.txt|join -t \| -j 1 $$.tmp -|sed 's/+/|/';rm $$.tmp
于 2012-11-07T20:26:20.667 に答える
2

これもうまくいくようです:

$ sed 's/|/\t/2' 1.txt > 1_1.txt; sed 's/|/\t/2' 2.txt > 2_1.txt;
$ join -j1 1_1.txt 2_1.txt | tr ' ' '|'
$ rm 1_1.txt 2_1.txt

一時ファイルを作成しないワンライナー (@dbaupp に感謝):

$ join -j1 <(sed 's/|/\t/2' 1.txt) <(sed 's/|/\t/2' 2.txt) | tr ' ' '|'
于 2012-11-07T20:28:49.353 に答える
0

別の解決策:

awk -F "|" '{getline a < "file1"}NR==1{print a, $3, $4 "\n"}NR==3{print a, $3, $4}' OFS="|" file2

結果:

$ awk -F "|" '{getline a < "file1"}NR==1{print a, $3, $4 "\n"}NR==3{print a, $3, $4}' OFS="|" file2
1|2|3|4|4|5

2|3|4|4|5|6
于 2012-11-08T07:46:33.693 に答える