AWK를 사용하여 다른 파일을 기반으로 한 파일에서 전체 문자열 값을 찾으려고 합니다.

AWK를 사용하여 다른 파일을 기반으로 한 파일에서 전체 문자열 값을 찾으려고 합니다.

안녕하세요. 파일이 2개 있습니다. 첫 번째 파일에는 다음과 같은 값이 포함되어 있습니다.

powershell
vectormaps
JuniperSA

두 번째 파일에는 값과 ID가 포함되어 있습니다.

appid uid
SplunkforSnort 340
powershell 610
vectormaps 729
JuniperSA 826
postfix 933
SplunkforJuniperSRX 929
TA-barracuda_webfilter 952
TA-dragon-ips 954
dhcpd 392

그래서 AWK를 사용하여 while 루프를 실행하여 값과 해당 ID를 가져오려고 시도했지만 출력 파일에는 다른 내용이 쓰여 있는 것 같습니다. 이것이 내가 while 루프를 실행하는 방법입니다.

while read $line;
do
awk '/'$line'/ {print $0}' file2.csv > new
done < file1

내 예상 결과는 다음과 같아야합니다

powershell 610
vectormaps 729
JuniperSA 826

하지만 내 출력은

appid uid
SplunkforSnort 340
powershell 610
vectormaps 729
JuniperSA 826
postfix 933
SplunkforJuniperSRX 929
TA-barracuda_webfilter 952
TA-dragon-ips 954
dhcpd 392

아무 일도 일어나지 않는 것 같습니다. 내가 여기서 무엇을 놓치고 있는 걸까요?

답변1

사용awk

$ awk 'FNR==NR {a[$1]=$2; next} {$(NF+1)=a[$1]}1' file2 file1
powershell 610
vectormaps 729
JuniperSA 826

답변2

while앞에서 언급했듯이 루프를 사용할 이유가 없거나 awk파일이 아무리 복잡하더라도 마찬가지입니다. 첫 번째 파일의 문자열을 포함하는 두 번째 파일의 줄을 인쇄하려고 합니다. 불필요하게 일을 복잡하게 만드는 것보다 KISS 접근 방식을 사용하는 것이 더 좋습니다.

다음은 원하는 작업을 수행합니다.

grep -f file1 file2.csv

답변3

셸에서 변수를 설정할 때 $ 기호를 사용하면 안 됩니다. 또한 awk는 쉘 변수를 사용할 수 없으므로 해당 변수를 awk에 전달해야 합니다.-v variable=value

while read line;
do 
awk -v line="$line" -e '{if  ($1 ~ line) print $0} ' file2.csv
done < file1 >new

관련 정보