다음 내용이 포함된 텍스트 파일이 있습니다.
duration: 17100
series: 2016
episode: 58
modesizes: original: hd1=9120MB,hd2=7543MB,sd1=4872MB,high1=2833MB,low1=634MB
runtime: 285
duration: 13740
series: 2016
episode: 59
modesizes: original: hd1=9024MB,hd2=7203MB,sd1=5104MB,high1=2950MB,low1=570MB
runtime: 229
duration
, episode
및 를 추출하고 싶습니다 modesizes
. 출력은 다음과 같아야 합니다.
13740,59,9024MB,7203MB,5104MB,2950MB,570MB
답변1
그리고 awk
:
awk '/duration|episode/{printf "%s,", $2} /modesizes/{gsub(/[^=,]+=/,"",$3); print $3}' file
설명하다:
/duration|episode/
라인이 일치하는 경우duration
또는episode
printf "%s,", $2
그런 다음 값으로 필드를 인쇄하십시오.
/modesizes/
라인이 일치하면modesizes
gsub(/[^=,]+=/,"",$3)
그런 다음 식별자와 등호를 제거하십시오.print $3
변경된 필드를 인쇄합니다.
입력 예제를 사용하면 다음이 인쇄됩니다.
17100,58,9120MB,7543MB,4872MB,2833MB,634MB
13740,59,9024MB,7203MB,5104MB,2950MB,570MB
답변2
grep
정규 표현식이 있는 경우pcre
$ grep -oP '(duration|episode):\s*\K\d+|\d+MB' ip.txt | pr -ats, -7
17100,58,9120MB,7543MB,4872MB,2833MB,634MB
13740,59,9024MB,7203MB,5104MB,2950MB,570MB
(duration|episode):\s*\K
Forward Lookback Checkduration
또는episode
뒤에:
0개 이상의 공백이 옵니다. 이것은 출력의 일부가 아닙니다.\d+
하나 이상의 숫자|\d+MB
대체 패턴, 다음으로 끝나는 하나 이상의 숫자MB
pr
그런 다음 ,
구분 기호 및 최대 열을 사용하여 7
얻은 출력 스타일을 지정합니다.
답변3
sed 솔루션:
sed -E -e \
'/duration:/{
N;N;N;N
s/duration:\s*([0-9]*).*episode:\s*([0-9]*).*hd1=([0-9]*MB),hd2=([0-9]*MB),sd1=([0-9]*MB),high1=([0-9]*MB),low1=([0-9]*MB).*/\1,\2,\3,\4,\5,\6/
}' < input_file
다음과 같이 출력됩니다.
17100,58,9120MB,7543MB,4872MB,2833MB
13740,59,9024MB,7203MB,5104MB,2950MB
빈 줄을 유지합니다.
이를 원하지 않는 경우:
sed -E -n -e \
'/duration:/{
N;N;N;N
s/duration:\s*([0-9]*).*episode:\s*([0-9]*).*hd1=([0-9]*MB),hd2=([0-9]*MB),sd1=([0-9]*MB),high1=([0-9]*MB),low1=([0-9]*MB).*/\1,\2,\3,\4,\5,\6/
p
d
}' < input_file