파일에서 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 루프를 한 줄의 코드로 완전히 바꿀 수 있습니다.

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와 동일

관련 정보