데이터 파일이 있습니다.
> head file.dat
"201731","474","1000522966","0.2670"
"201732","474","1000522966","0.3163"
"201733","474","1000522966","0.3902"
"201734","474","1000522966","0.4479"
"201735","474","1000522966","0.5960"
"201736","474","1000522966","0.2598"
"201737","474","1000522966","0.3937"
"201738","474","1000522966","0.3558"
"201739","474","1000522966","0.3344"
"201740","474","1000522966","0.5544"
"201731"이 있는 행만 유지되도록 필터링하고 싶습니다.
나는 여러 awk 명령을 시도했습니다.
awk -F , '{ if ($1 == "201731") { print } }' file.dat | head
awk -F '","' 'BEGIN {OFS=","} { if (toupper($1) == "201731") print }' file.dat | head
awk -F '","' '{ if (toupper($1) == "201731") print }' file.dat | head
awk -F ',' '{ if (toupper($1) == "201731") print }' file.dat | head
그들 중 누구도 작동하지 않습니다. 둘 다 오류 없이 실행되고 출력이 없는 빈 프롬프트가 표시됩니다.
저는 awk 버전 GNU Awk 3.1.7을 사용하고 있습니다.
이 웹사이트에도 거의 동일한 질문과 답변이 존재하지만, 그것마저도 작동하지 않습니다. 내가 뭘 잘못했나요?
답변1
귀하의 코드:
awk -F , '{ if ($1 == "201731") { print } }' file.dat
$1
필드 구분 기호를 사용하여 읽을 때 ,
데이터에 있는 큰따옴표도 포함된다는 사실을 제외하면 이는 거의 정확합니다. 다른 시도도 본질적으로 유사하지만 toupper()
숫자에 어떤 영향이 있을 것이라고 생각하는지 잘 모르겠습니다 .
$1 ~ /201731/
정규식을 사용하여 첫 번째 필드 일치를 사용하거나 (또는 $1 ~ /^"201731"$/
잘못된 긍정을 방지하기 위해 처음부터 끝까지 필드 내용을 완전히 지정) 정규식 수식 일치를 수행하는 대신 고정 문자열을 확인하려는 경우 사용할 수 있지만 테스트 필드에 대해 \"201731\"
.
그래서 당신은
awk -F ',' '$1 ~ /^"201731"$/' file.in
또는
awk -F ',' '$1 == "\"201731\""' file.in
답변2
주문하다:
awk '/"201731"/' file
201731이 포함된 행만 출력됩니다.
내가 당신의 임무를 잘못 이해했다면 정정해 주십시오.