여러 구분 기호가 있는 Awk 추출 필드

여러 구분 기호가 있는 Awk 추출 필드

파일의 내용은 다음과 같습니다

AB: 20190131  13 J-1|19:30:00.000000000 18:06:00.000000000 123466  50 @TEST . "" 1234 - I . ".." "" "" "TEST TEXT 1" "TEXT 2: Sr of human happiness. To obtain some advantage from it? But who has any right to find f.==Required file.csv.gz FIELD*SERVER-TIME*05:29:51.981378000" "" NoTime
AB: 20190131  1 J-1|19:30:00.000000000 18:06:00.000000000 123466  50 @TEST . "" 1234 - I . ".." "" "" "TEST TEXT 1" "TEXT 2: Sr of human happiness. To obtain some advantage from it? But who has any right to find f.==Required file2.csv.gz,Required file5.csv.gz FIELD*SERVER-TIME*05:29:51.981378000" "" NoTime

첫 번째 필드를 필드 구분 기호(==)로 사용하여 *csv.gz 파일 이름이 뒤에 오는 세 번째 필드를 인쇄하고 싶습니다.

샘플 출력은 다음과 같습니다

13,Required file.csv.gz
1,Required file2.csv.gz,Required file5.csv.gz

다음 명령을 사용하여 파일 이름을 추출할 수 있습니다.

awk -F "==" '/.csv.gz/{print $2}' | awk '{print $1}'

그러나 같은 행의 세 번째 필드를 가져올 수 없습니다.

답변1

당신은 match()그것을 사용할 수 있습니다프로그램 시작,길이그리고 substr():

awk 'match($0,/==.*?.csv.gz/){print $3","substr($0, RSTART+2, RLENGTH-2)}' file 

어디

match()패턴과 일치하는 하위 문자열을 찾기 위해 함수를 사용합니다 /==.*?.csv.gz/. 일치하는 행에 대해 우리는 얻을 것입니다프로그램 시작그리고길이일치하는 텍스트의 위치와 길이를 식별한 다음 ( 및 일치하는 텍스트에서 선행 '==' 제거)를 substr($0, RSTART+2, RLENGTH-2)사용하여 텍스트를 검색합니다 .+2-2

답변2

이 시도,

옵션 1:

awk '{gsub(/f.==/, ""); print $3","$(NF-4)" "$(NF-3)}' file

13,Required file.csv.gz
  • gsub"f.=="를 null로 대체합니다.
  • 처음부터 세 번째 필드를 인쇄하고 줄 끝에서 네 번째 및 세 번째 필드를 인쇄합니다.

옵션 2:

echo "`awk '{ print $3}' file && awk -F '==' '{print $2}' file| awk '{print $1" "$2}'`" | tr '\n' ','
  • 공백을 구분 기호로 사용하여 세 번째 열을 인쇄합니다.
  • "=="를 구분 기호로 사용하여 두 번째 열을 구문 분석하고 공백을 구분 기호로 사용하여 첫 번째와 두 번째 열을 인쇄합니다.
  • 쉼표로 개행 변환

참고: 옵션 2는 단일 라인 입력에만 작동합니다.

답변3

awk를 사용하십시오.

awk '{
        printf "%s,", $3
        match($0, /Required [a-z]+\.csv\.gz/, a)
        print a[0]
    }' /tmp/file

2가지 명령이 있습니다:

awk '{printf "%s,", $3}' /tmp/file
grep -oP 'f.==\KRequired \w+.csv.gz' /tmp/file

산출

13,Required file.csv.gz

관련 정보