여러 줄을 포함하는 여러 파일이 있습니다. 그중에서 나는 다음과 같은 특정 패턴으로 시작하는 줄에만 관심이 있습니다.
USER1 Info> :FERRARI:RED,:LAMBORGHINI:ORANGE,:MASERATI:BLUE,...
이 예에서는(표시된 대로 공백 포함)
이 행에서 자동차 제조사 정보(색상 없음)만 원하므로 출력은 다음과 같아야 합니다.
FERRARI, LAMBORGHINI and MASERATI
자동차 브랜드는 파일마다 항상 다릅니다. 이 예에서는 3개의 자동차 브랜드를 입력했지만 각 파일에는 그 수가 더 많거나 적을 수 있습니다. Bash나 Python에서 이 작업을 수행하는 쉬운 방법이 있습니까? 감사해요
답변1
두 콜론 사이의 모든 단어를 추출합니다(쉼표 제외).
grep -oHnE ":[^,]*:" files* | awk 'BEGIN{FS=":"} {x=$1$2; a[x]=a[x]","$4} END{for(x in a) print a[x]}' | sed 's/^,//'
car_info.txt 파일이 있다고 가정합니다.
cat car_info.txt
USER1 Info> :FERRARI:RED,:LAMBORGHINI:ORANGE,:MASERATI:BLUE
USER1 Info> :FERRARI:RED,:LAMBORGHINI:ORANGE
USER1 Info> :FERRARI:RED,:LAMBORGHINI:ORANGE,:MASERATI:BLUE
grep -oHnE ":[^,]*:" car_info.txt
car_info.txt:1::FERRARI:
car_info.txt:1::LAMBORGHINI:
car_info.txt:1::MASERATI:
car_info.txt:2::FERRARI:
car_info.txt:2::LAMBORGHINI:
car_info.txt:3::FERRARI:
car_info.txt:3::LAMBORGHINI:
car_info.txt:3::MASERATI:
grep
-o
일치하는 줄 중 일치하는 부분만 인쇄-H
파일 이름 인쇄-n
줄 번호 인쇄-E
확장 정규식 지원
이제 전략은 동일한 내용이 포함된 행을 filename:line
한 행에 표시하는 것 입니다.
awk 'BEGIN{FS=":"} {x=$1$2;a[x]=a[x]","$4} END{for(x in a) print a[x]}'
BEGIN{FS=":"}
필드 구분 기호를 다음으로 설정하세요.:
x=$1$2
넣고filename
또line
넣어x
a
key=를 사용하여 키 값을 생성x
하고 각 행의 값에 네 번째 필드를 추가합니다.x
for(x in a) print a[x]
키-값 쌍의 값을 인쇄합니다.a
sed 's/^,//'
,
줄의 처음부터 삭제하는 데 사용됩니다 .
답변2
awk -F':' /^USER1.\*Info/' {print $2" "$4" "$6}' < infile