web-dev-qa-db-ja.com

AWKの出力を別のファイルで検索する

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
4
ASAD

次のように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の行全体を印刷します。

7
αғsнιη

比較する列がソートされている場合、joinを使用できます。

join -o 2.1,2.2 file1 file2

joinは、入力ファイルのソートされた列に一致し、それらを出力します。 -o 2,1,2.2は、出力を2番目の入力ファイルの1列目と2列目に制限します。

4
muru

次のワンライナーを使用できます。

cut -f1 fileA | grep -f - fileB > fileC
  • cutコマンドは、fileAの最初の列を抽出します(タブ区切りを想定しています。-dを使用して他の何かを指定します)
  • grepコマンドは、cutの出力を取得し、fileBですべての文字列を検索します。
  • 出力はfileCに書き込まれます
3
Wayne_Yux

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.
2
ankit7540

あなたはすでにいくつかの素晴らしい答えを受け取っています。ミックスに追加するために、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
2
terdon