パターンが一致すると、他のファイルの行をマージします。

パターンが一致すると、他のファイルの行をマージします。

入力:タブで区切られた2つのファイルFile1File2File2$2)はFile1()$1のパターンで解析する必要があります。

期待される出力:タブで区切られたファイル。File3に 。File3と同じ行とFile2パターンが一致する場合は、対応する値File1(行末、タブ区切り)を含める必要があります。

ファイル1(タブ区切り):

ABC1    1    3
ABC2    4    3
ABC3    3    2
ABC4    3    3

ファイル2(タブ区切り):

text1   ABC1-AB   text2   text3
text2   ABC2-AB   text1   
text3   ABC1-CD   text2
text4   ABC5-AB   text3   text4

ファイル3:

text1   ABC1-AB   text2   text3    1    3
text2   ABC2-AB   text1    4    3
text3   ABC1-CD   text2    1    3
text4   ABC5-AB   text3   text4

答え1

そしてawk

awk 'FNR==NR{a[$1]=$2"\t"$3} FNR!=NR{split($2,b,"-"); $0=$0"\t"a[b[1]];print}' file1 file2
  • FNR==NR最初のファイルの場合file1:
    • a[$1]=$2"\t"$3a2番目と3番目のフィールドで配列を埋め、最初のフィールドをインデックスとして使用します。
  • FNR!=NR2番目のファイルの場合file2
    • split($2,b,"-")で2番目のフィールドを分割します-
    • $0=$0"\t"a[b[1]]行に2つの値を追加します。
    • printこの行を印刷してください。

出力:

text1   ABC1-AB text2   text3   1   3
text2   ABC2-AB text1   4   3
text3   ABC1-CD text2   1   3
text4   ABC5-AB text3   text4

答え2

テストにはBASHを使用してください。

while read LINEFILE2
do
  printf "$LINEFILE2" >> File3
  while read LINEFILE1
  do
    read PATTERN ADDITIONS <<EOF
$LINEFILE1
EOF
    [ ! -z "$PATTERN" ] && [ ! -z $(echo "$LINEFILE2" | cut -f2 | grep "$PATTERN") ] && {
      printf "\t$ADDITIONS\n" >> File3
    }
  done < File1
done < File2

列 2 だけではなく、行全体内のパターンを見つけるには、cutパイプ構造からコマンドを取得できます。

関連情報