2つのファイルfileAとfileBがあります。
awk '{print $1}'
のようにfileAからcolumn1を抽出する必要があり、次に出力が他のfileBで検索され、次のような簡単な言葉で一致したレコードが新しいファイルfileCに保存されます。
fileA
:
seg1 rec1
seg2 rec2
seg3 rec3
Awkコマンドを使用して列1を取得する必要があり、この列1をfileB
で検索して、次のようなレコードを取得します。
fileB
:
seg1 one
seg2 two
seg3 three
seg4 four
seg5 five
FileAからcolumn1データが抽出され、このデータがfileBでの検索に使用され、一致したレコードがテストファイルに保存されます。私の出力は次のようになります。
fileC
:
seg1 one
seg2 two
seg3 three
次のようにawk
で簡単に実現できます。
awk 'NR==FNR{inFileA[$1]; next} ($1 in inFileA)' fileA fileB > write_to_fileC
結果、
seg1 one
seg2 two
seg3 three
上記では、最初にfileAを読み取り、column1全体をinFileAという名前の配列に保持します。次に、fileBで最初の列を検索し、保存されたものと一致する場合fileAのcolumn1は、fileBの行全体を印刷します。
比較する列がソートされている場合、join
を使用できます。
join -o 2.1,2.2 file1 file2
join
は、入力ファイルのソートされた列に一致し、それらを出力します。 -o 2,1,2.2
は、出力を2番目の入力ファイルの1列目と2列目に制限します。
次のワンライナーを使用できます。
cut -f1 fileA | grep -f - fileB > fileC
cut
コマンドは、fileA
の最初の列を抽出します(タブ区切りを想定しています。-d
を使用して他の何かを指定します)grep
コマンドは、cut
の出力を取得し、fileB
ですべての文字列を検索します。fileC
に書き込まれますBashスクリプトを使用した試み。 (実行可能にすることを忘れないでください。)
fileA
およびfileB
は、スクリプトと同じフォルダーに存在する必要があります。
スクリプトで記述された任意の2つのファイルで機能し、<fa>_<fb>_match.txt
として一致するテキストを持つファイルを生成する一般的なスクリプト:
これを使用するには、./script_name.sh fileA fileB
を実行します
#!/bin/bash
fa="$1" # first file- which has columns
fb="$2" # second file - which has raw data to be searched
# file with name <fa>_<fb>_match.txt will be generated.
myarr=($(awk 'NR>1 {print $1}' "$fa")) # NR makes awk to ignore first row.
for index in ${!myarr[@]}; do
#echo $index/${#myarr[@]}
#echo "${myarr[index]}"
text="${myarr[index]}"
grep -w -F "$text" $fb >> $fa"_"$fb"_match".txt
done
# file with name <fa>_<fb>_match.txt will be generated.
あなたはすでにいくつかの素晴らしい答えを受け取っています。ミックスに追加するために、Perlのアプローチを次に示します。
$ Perl -ane '$i ? $k{$F[0]} && print : { $k{$F[0]}++ }; $i++ if eof' fileA fileB
seg1 one
seg2 two
seg3 three
そして、ゴルフバージョンの KasiyAの答え :
$ awk 'NR==FNR ? a[$1] : $1 in a' fileA fileB
seg1 one
seg2 two
seg3 three
そして、これはちょっと複雑なgrep
ソリューションです:
$ grep -Ff <(grep -oP '^\S+' fileA) fileB
seg1 one
seg2 two
seg3 three