
파일의 내용은 다음과 같습니다
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