파일의 특정 부분을 추출하는 방법은 무엇입니까?

파일의 특정 부분을 추출하는 방법은 무엇입니까?

여러 줄을 포함하는 여러 파일이 있습니다. 그중에서 나는 다음과 같은 특정 패턴으로 시작하는 줄에만 관심이 있습니다.

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넣고 filenameline넣어x
  • akey=를 사용하여 키 값을 생성 x하고 각 행의 값에 네 번째 필드를 추가합니다.x
  • for(x in a) print a[x]키-값 쌍의 값을 인쇄합니다.a

sed 's/^,//',줄의 처음부터 삭제하는 데 사용됩니다 .

답변2

awk -F':' /^USER1.\*Info/' {print $2" "$4" "$6}' < infile

관련 정보