AWK:INPUT.txtの最後の列のTABLEテキストを検索し、その列をINPUT.txtに追加します。

AWK:INPUT.txtの最後の列のTABLEテキストを検索し、その列をINPUT.txtに追加します。

皆さん、私はこのようなINPUT.txtを持っています(最後の列を参照)。

INPUT.txt
63 M 27 BS/BA TEHRANI 3 4 298320 310050 11730 j j
63 M 27 BS/BA TEHRANI 3 4 310050 311430 1380 ( a
63 M 27 BS/BA TEHRANI 3 4 311430 312080 650 ] ]

そして、このような2つのテーブルテキストがあります。 2つの列があります。

TABLE1.txt
j feat1
a feat2
.
.
.

そして

TABLE2.txt
j sp1
a sp2
.
.

INPUT.txtに2つの列を追加したいです。 INPUT.txt の最後の列の TABLE テキストを検索し、その列を INPUT.txt に追加します。 (j feat1 sp1のようなテーブルをマージすることは可能だと思います。)このように出力します。

output.txt
CodeGender Age Grade Dialect Session Sentence Start End Length Phonemic     Phonetic feat sp
63 M 27 BS/BA TEHRANI 3 4 298320 310050 11730 j j feat1 sp1
63 M 27 BS/BA TEHRANI 3 4 310050 311430 1380 ( a feat2 sp2
63 M 27 BS/BA TEHRANI 3 4 311430 312080 650 ] ]
.
.
.

答え1

GNU awkがある場合は、NR==FNR {a[$1]=$2; next} $NF in a {print $0, a[$NF]}次の修正を適用して正規の多次元バージョンを使用できます。

  1. このトリックを使用してルックアップテーブルを作成するか使用するかを決定することはできず、処理されNR==FNRたファイルの数を計算する必要があります。

  2. 基本インデックスを明示的に繰り返し、各サブ配列のキーが一致することをテストする必要があります。

前任者。

gawk '
  BEGINFILE{k++}
  k<3 {a[k][$1]=$2; next} 
  {nf = NF; for (l in a) {if ($nf in a[l]) {$(NF+1) = a[l][$nf]}}}
  {print}
' TABLE1.txt TABLE2.txt INPUT.txt 

63 M 27 BS/BA TEHRANI 3 4 298320 310050 11730 j j feat1 sp1
63 M 27 BS/BA TEHRANI 3 4 310050 311430 1380 ( a feat2 sp2
63 M 27 BS/BA TEHRANI 3 4 311430 312080 650 ] ]

列ヘッダーが必要な場合は、BEGINルールで印刷してください。

答え2

これを試してみることもできます。

awk '
FILENAME!=fn{
  a[$1]=a[$1]FS$2
  next
}
$NF in a{
  $0=$0a[$NF]
}
1
' fn='INPUT.txt' TABLE1.txt TABLE2.txt INPUT.txt

答え3

私は2段階にしました。

ステップ1

awk 'FNR==NR{a[FNR]=$2;next};{$(NF + 1)=a[FNR]}1' file1 input.txt  >> final_final.txt

ステップ2

awk 'FNR==NR{a[FNR]=$2;next};{$(NF + 1)=a[FNR]}1' file2 final_final.txt

出力

63 M 27 BS/BA TEHRANI 3 4 298320 310050 11730 j j feat1 sp1
63 M 27 BS/BA TEHRANI 3 4 310050 311430 1380 ( a feat2 sp2
63 M 27 BS/BA TEHRANI 3 4 311430 312080 650 ] ]

関連情報