ファイルから awk 文字列を grep し、文字列ファイルの別の部分に書き込みます。

ファイルから awk 文字列を grep し、文字列ファイルの別の部分に書き込みます。

私のファイルaaaには5行があります。

01_AAA-11-ID22
02_BBB-33-ID44
03_CCC-55-ID66
.
.

私はbigfile.txtファイルの下線の後にあるものをgrepしようとしています。

for i in $(cat aaa)
do
A= $(awk -F '_' '{print $1}' $i)
B= $(awk -F '_' '{print $2}' $i)
grep $B bigfile.txt > $A
done

~しようとする

grep AAA-11-22 bigfile.txt > 01

しかし、うまくいかないようです。私のエラーコードは

awk:コマンド。行:1:致命的:読み取るために '01_AAA-11-22'ファイルを開くことができません(そのファイルまたはディレクトリはありません)。

アドバイスが必要です。ありがとう、

答え1

$iファイルで開こうとするのではなく、echoを使用してください。

for i in $(cat aaa)
do
  A= $(echo $1 | awk -F '_' '{print $1}')
  B= $(echo $i | awk -F '_' '{print $2}')
  grep $B bigfile.txt > $A
done

しかし、興味があれば、awkこのforループを1行のコードに完全に置き換えることができます。

awk -F '_' '{system("grep "$2" bigfile.txt > "$1)}' aaa

答え2

使用する必要はありませんアッ別の言葉

while read i
do
    grep ${i#*_} bigfile.txt > ${i%%_*}
done <aaa

~のためGNU sed

sed 's/\([^_]\+\)_\(.*\)/sed "\/\2\/!d" bigfile.txt >"\1"/e' aaa

~のためアッ(あなたが意図している場合)

awk -F_ '
    NR == FNR{
        A[$2] = $1
        next
    }
    {
        for(a in A)
            if($0 ~ a)
                print > A[a]
    }
    ' aaa bigfile.txt

大容量ファイルの場合は、以下を使用する必要があります。

                print >> A[a]
                close(A[a])

答え3

awkにはechopassを使用する必要があります。$iそれ以外の場合はファイルを探します。

A=$(echo $i | awk -F_ '{print $1}')

Bと同じ

関連情報