awk: 다른 필드 구분 기호를 사용하고 다른 열에서 작동하는 방법

awk: 다른 필드 구분 기호를 사용하고 다른 열에서 작동하는 방법

여러 파일을 사용하여 특정 문자열이 포함된 열을 추출하려고 하는데 파일마다 필드 구분 기호가 다르고 파일에 따라 문자열이 다른 열에 나타납니다.

파일 1의 예제 라인( 로 구분됨 :):

sss:string1:rrr

파일 2의 예제 라인( 로 구분됨 ,):

sss,sss,string321,sss,sss

파일 3의 예제 라인( 로 구분됨 '):

example'e123'string2'lol

awk또는 다른 명령줄 도구를 사용하여 위의 세 파일에서 "문자열"을 어떻게 찾을 수 있습니까?

나는 다음을 실행할 수 있다는 것을 알고 있습니다 file 1.

awk -F: '$2 ~ /string/ {print $2}'

출력은 다음과 같습니다:

string1

하지만 각 파일을 개별적으로 처리하는 데 시간이 많이 걸리기 때문에 여러 구분 기호와 여러 열이 있는 여러 파일에 대해 이 작업을 수행하고 싶습니다. 할 수 있나요?

답변1

3번의 개별 통화를 하세요:

awk -F: '{print $2}' file1
awk -F, '{print $3}' file2
awk -F\' '{print $3}' file3

아마도 이 정도 속도일 것이다.

awk '
    FILENAME == "file1" && FNR == 1 {FS = ":"; col = 2; $0 = $0}
    FILENAME == "file2" && FNR == 1 {FS = ","; col = 3; $0 = $0}
    FILENAME == "file3" && FNR == 1 {FS = "'\''"; col = 3; $0 = $0}
    {print $col}
' file1 file2 file3

물론 전자가 읽고 유지하기가 더 쉽습니다.

~처럼젠 오브 파이톤그들은 복잡함보다 단순함이 낫다고 말합니다.

답변2

하나의 명령으로 이 작업을 수행하려면 다음이 작동합니다.

awk -F : '{print $2}' file1 && awk -F : '{print $3}' file2 && awk -F : '{print $3}' file3

그러면 다음이 출력됩니다.

string1
string321
string2

string인쇄만 하고 아무것도 포함하지 않으 려면 다음을 수행하세요.

awk -F : '{print substr($2,1,6)}' file1 && awk -F , '{print substr($3,1,6)}' file2 && awk -F \' '{print substr($3,1,6)}' file3

설명하다:

substr($2,1,6)첫 번째 위치에서 시작하고 6자를 포함하는 두 번째 필드의 하위 문자열을 인쇄합니다 string. 출력은 다음과 같습니다

string
string
string

관련 정보