파일의 Grep 변수

파일의 Grep 변수

입력 파일을 사용하여 스크립트로 수정된 파일 -

141,141_1,bar,honda,ps2_0,할당되지 않음,ps3_0,할당되지 않음,ps4_0,할당되지 않음,ps5_0,할당되지 않음,ps6_0,할당되지 않음,ps7_3,until,will,.....

입력 파일-

141. PS7, 틸웰

이제 ps7_3 열이 올바른 값으로 업데이트되었는지 검색해야 합니다.

그래서 입력 파일에서 열을 분리했습니다.

while read -r line;
do
sub1=$(echo $line|cut -f 1 -d ',');
sub2=$(echo $line|cut -f 2 -d ',');
sub3=$(echo $line|cut -f 3 -d ',');
sub4=$(echo $sub2'.*,'$sub3|sed -e "s/\(.*\)\r/'\1'/");
echo $sub1;
echo $sub2;
echo $sub3;
echo $sub4;
grep $sub4 modded_file.csv.dat;
done<input.csv

출력은 -

141
ps7
TILL WILL
'ps7.*,TILL WILL'
grep: WILL': No such file or directory

하지만 실행하면 grep 'ps7.*,TILL WILL' modded_file.csv.dat작동합니다. 위에 표시된 것과 같은 변수를 파일에 어떻게 grep합니까?

답변1

입력에서 볼 수 있듯이 변수 sub4에 공백 기호가 있으므로 다음 줄을 다시 작성합니다.

grep $sub4 modded_file.csv.dat;

~이 되다

grep -- "$sub4" modded_file.csv.dat;

(@philippos가 추가함) 그리고 작은따옴표는 검색 패턴의 일부로 간주되므로 $sub4포함해서는 안 됩니다 .'

나는 당신의 오해가 인용과 확장이 수행되는 순서라고 생각합니다. 변수가 먼저 확장되고 그 다음에 인용되므로 확장 후 변수의 작은 따옴표가 문자열을 인용할 것이라고 생각합니다. 하지만 실제로 인용은 변수 확장 이전에 이루어지므로 인용이 필요합니다.$sub

답변2

grep루프 내부에서 실행하는 것은 거대한 안티 패턴입니다. 이 시도.

awk -F "," 'NR==FNR { key[$1]=$2; value[$1]=$3; next }
    ($1 in key) && ($0 !~ "^" $1 ",.*," key[$1] "," value[$1] ",")' input.csv modded_file.csv.dat

\r나는 왜 당신이 특정 방식으로 거기에 있기를 원하거나 기대하는지 이해하려고 노력하는 것이 아니므 로 약간의 조정이 필요할 수 있습니다.

Awk 스크립트는 각 입력 라인에 차례로 적용되는 일련의 *조건부 동작 쌍으로 {구성됩니다 . 이 입력 줄을 건너뛰고 다음 입력으로 점프하는 나머지 스크립트를 }사용할 수 있으며 생략할 수 있습니다.next{행동}전체 입력 줄을 인쇄하려는 경우. (생략하셔도 됩니다.상황 뭔가를 무조건 하고 싶다면. ) 각 줄은 스크립트에서 $1다음과 같이 사용할 수 있는 필드로 구분됩니다. 필드 구분 기호를 쉼표로 설정합니다(기본값은 일련의 공백입니다).$2-F ","

NR==FNR관용구는 Awk에서 두 개의 입력 파일을 처리하는 일반적인 방법입니다. 첫 번째 입력 파일을 처리할 때 총 줄 번호는 NR파일 내의 줄 번호와 같고 이후에는 false가 됩니다.FNR

첫 번째 파일을 읽을 때 두 개의 연관 배열에 필드를 저장합니다. 둘 다 첫 번째 필드를 키로 사용합니다.

두 번째 파일을 읽을 때 배열에서 키가 발견된 각 입력 줄을 인쇄하고 key전체 줄이 예상 정규식과 일치하지 않습니다(첫 번째 필드는 키이고 그 뒤에 아무 것도 오고 그 뒤에 쉼표, 열 에 저장하는 이름 key[$1], 또 다른 쉼표, 에 저장하는 예상 값 value[$1], 또 다른 쉼표).

즉, 예상되는 조건을 충족하지 않는 행을 찾습니다. !성냥을 원하시면 꺼내세요.

관련 정보