![AWK를 사용하여 다른 파일을 기반으로 한 파일에서 전체 문자열 값을 찾으려고 합니다.](https://linux55.com/image/208754/AWK%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%EB%8B%A4%EB%A5%B8%20%ED%8C%8C%EC%9D%BC%EC%9D%84%20%EA%B8%B0%EB%B0%98%EC%9C%BC%EB%A1%9C%20%ED%95%9C%20%ED%8C%8C%EC%9D%BC%EC%97%90%EC%84%9C%20%EC%A0%84%EC%B2%B4%20%EB%AC%B8%EC%9E%90%EC%97%B4%20%EA%B0%92%EC%9D%84%20%EC%B0%BE%EC%9C%BC%EB%A0%A4%EA%B3%A0%20%ED%95%A9%EB%8B%88%EB%8B%A4..png)
안녕하세요. 파일이 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