![ファイルから特定のデータを抽出するには、キーワード[awk]を使用してください。](https://linux33.com/image/104581/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%8B%E3%82%89%E7%89%B9%E5%AE%9A%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E6%8A%BD%E5%87%BA%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF%E3%80%81%E3%82%AD%E3%83%BC%E3%83%AF%E3%83%BC%E3%83%89%5Bawk%5D%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84%E3%80%82.png)
次のような複雑なファイルがあります。
configuration {
step 58000
dt 2.00000000000000e+00
}
colvar {
name r
x 1.44869849559022e+01
}
0.00000000000000e+00 0.00000000000000e+00 0.00000000000000e+00
0.00000000000000e+00 0.00000000000000e+00 0.00000000000000e+00
hill {
step 1440
weight 1.00000000000000e-01
centers 1.47455750990065e+01 -1.69229380745887e+02
widths 1.25331413731550e+00 1.25331413731550e+00
}
hill {
step 1560
weight 1.00000000000000e-01
centers 1.47435719215456e+01 -1.70289673373179e+02
widths 1.25331413731550e+00 1.25331413731550e+00
}
hill {
step 1680
weight 1.00000000000000e-01
centers 1.47427376221419e+01 -1.68774767870364e+02
widths 1.25331413731550e+00 1.25331413731550e+00
}
このファイルからストライド、重量、幅を抽出し、タブ区切りを使用して新しい出力ファイルに書き込むことに興味があります。このように:-
#!step width1 width2 weight
1440 1.25331413731550e+00 1.25331413731550e+00 1.00000000000000e-01
私は次のように書かれたステップと重量を持っています。
awk ' b ~ /hill/ && a ~ /step/ && /weight/ {print v"\t"$2}{b=a; a=$0; v=$2}' input > output
幅を書くように拡張するにはどうすればよいですか?
答え1
getline 関数を使用して、次の行を読み取ることができます。
$ awk -vOFS='\t' '/^hill {/{
getline; st=$2
getline; we=$2
getline; getline; wd1=$2; wd2=$3
print st, we, wd1, wd2
}' file
1440 1.00000000000000e-01 1.25331413731550e+00 1.25331413731550e+00
1560 1.00000000000000e-01 1.25331413731550e+00 1.25331413731550e+00
1680 1.00000000000000e-01 1.25331413731550e+00 1.25331413731550e+00
答え2
明確にするために、次の解決策が拡張されました。
awk '/hill/ { delete data }
/step/ { data["step"] = $2 }
/weight/ { data["weight"] = $2 }
/widths/ { data["widths"] = $2 "\t" $3;
print data["step"] "\t" data["weight"] "\t" data["widths"]; }' input
答え3
入力ファイルを解析するには、次のコマンドラインを使用します。
echo -e "step\twidth1\t\t\twidth2\t\t\tweight" && grep -A4 ^hill widwei.txt | grep "step\|weight\|widths" | awk '{$1=""; print $0}' | awk 'NR%3{printf $0"";next;}1' | awk ' { t = $3; $3 = $2; $2 = t; print; } ' | awk ' { t = $4; $4 = $3; $3 = t; print; } ' | sed -e 's/^ //g' | sed -e 's/ /\t/g'
- タイトル印刷
- 次の4つの路線に乗って山岳区間に進みます。
- 歩数、重量、幅の値を取得します。
- 1行に印刷します。
- 希望の形式を取得するには、列を置き換えます。
- 残りの先行スペースを削除し、タブで区切ります。
答え4
awk -v RS="hill {" 'NF==11 {$1=$3=$5=$8=$11=""; print }' file
(gnu awkを使う;適応するのは簡単ですが、このソリューションはフォーマットの変更には強くありません)
-v RS="hill {"
新しいレコード区切り記号(RS)の定義(デフォルトでは行、現在「山」段落)NF==11
...レコードに11個のフィールドがある場合$1=$3=$5=$8=$11="";
...テキストを削除print
...そして通知を印刷してください