
파일은 입력 파일을 사용하는 스크립트에 의해 수정됩니다.
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]
, 또 다른 쉼표).
즉, 예상한 조건이 충족되지 않은 라인을 찾는다. !
대신 성냥을 원하면 꺼내세요 .