次の内容を含むテキストファイルがあります。
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+
1つ以上の数字|\d+MB
代替パターン、次に終わる1つ以上の数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