入力:タブで区切られた2つのファイルFile1
とFile2
。File2
($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"$3
a
2番目と3番目のフィールドで配列を埋め、最初のフィールドをインデックスとして使用します。
FNR!=NR
2番目のファイルの場合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
パイプ構造からコマンドを取得できます。