从文件中 grep 一个 awk 字符串并写入字符串文件的另一部分

从文件中 grep 一个 awk 字符串并写入字符串文件的另一部分

我的文件 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

echo$i而不是尝试将其作为文件打开:

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 循环:

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

答案2

你不需要使用awk根本不

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

为了GNU sed

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

为了awk(如果你愿意的话)

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

您必须使用echo将 传递$i给 awk。否则它会查找文件。

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

与B相同

相关内容