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