파일의 변수를 Grep합니다.

파일의 변수를 Grep합니다.

파일은 입력 파일을 사용하는 스크립트에 의해 수정됩니다.

141,141_1,BAR,HONDA,ps2_0,미할당,ps3_0,미할당,ps4_0,미할당,ps5_0,미할당,ps6_0,미할당,ps7_3,TILL 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], 또 다른 쉼표).

즉, 예상한 조건이 충족되지 않은 라인을 찾는다. !대신 성냥을 원하면 꺼내세요 .

관련 정보