긴 파일의 열 2에서 정확한 숫자를 추출하기 위해 grep을 사용하고 있습니다.
다음 코드를 사용하고 있습니다.
grep -e "^71161 |^71072 |^72617 " mainfile > outputfile
이건 효과가 없어outputfile
도와주세요.
내 파일은 다음과 같습니다.
Date ID STN SUPER LAT LONG OBS VAR
2014060106 71072 146 S000438 48.37 270.68 2 0
2014060106 71108 12 71108 49.03 237.63 0 0.04
2014060212 71108 12 71108 49.03 237.63 0 0.16
2014060212 71120 12 71120 54.4 249.73 0 0
2014060212 71123 12 S000400 53.32 246.42 0 0.11
2014060212 71125 12 S000961 54.13 251.48 0.05 0.00
2014060212 71140 12 S000388 49.92 260.05 2 0.21
2014060212 71150 146 71150 50.45 259.4 1 2.21
답변1
awk
더 나은 옵션은 다음과 같습니다.
awk 'BEGIN{a[71161] a[71072] a[72617]}; $2 in a' < mainfile
또는:
awk '$2 ~ /^(72617|71072|71161)$/' < mainfile
또는:
awk '$2 == "71161" || $2 == "71072" || $2 == "72617"' < mainfile
(POSIX awk 구현을 사용하면(현재 Linux 배포판에서 일반적인 구현은 아니지만) ==
문자열에 적용되는 연산자는 두 문자열이 동일한지 테스트합니다.같은 것을 정리하다, 이는 다음과 다를 수 있습니다.평등. 예를 들어, UTF-8 로케일의 GNU 시스템에서 POSIX awk는 "71161" == "٧١١٦١"
이러한 GNU 로케일의 현재 버전에서 동부 아라비아 숫자가 서부 아라비아 숫자(영어)와 동일한 값을 갖기 때문에 true를 반환합니다 . 따라서 이를 방지하려면 ) LC_ALL
로 설정하는 것이 좋습니다 C
.
너도 할 수 있어숫자비교하다:
awk '$2 == 71161 || $2 == 71072 || $2 == 72617' < mainfile
또한 71161.0, 71.161e3 또는 0x115f9의 두 번째 필드가 있는 행을 반환합니다(GNU의 경우 awk
16진수를 고려하려면 환경에서 POSIXLY_CORRECT를 전달해야 함).