というファイルがありますFile-1
。パターンを一致させる必要がありDATA_POINTS
、行をスキップしてから、次の行の6番目の列を印刷しようとします。
File-1
例:here ! some other data exist but all of them are totally different from the below data! In simple words following data is completely unique. DATA_POINTS 12 0.0000000000 0.0000000000 0.0000000000 20 ! A 0.5000000000 0.5000000000 0.0000000000 20 ! B 0.7500000000 0.5000000000 0.2500000000 20 ! C 0.7500000000 0.3750000000 0.3750000000 20 ! D 0.0000000000 0.0000000000 0.0000000000 20 ! E 0.5000000000 0.5000000000 0.5000000000 20 ! F 0.6250000000 0.6250000000 0.2500000000 20 ! U 0.7500000000 0.5000000000 0.2500000000 20 ! W 0.5000000000 0.5000000000 0.5000000000 20 ! L 0.7500000000 0.3750000000 0.3750000000 20 ! K 0.6250000000 0.6250000000 0.2500000000 20 ! U 0.5000000000 0.5000000000 0.0000000000 20 ! X
- 希望の出力
S1 = A S2 = B S3 = C S4 = D S5 = E S6 = F S7 = U S8 = W S9 = L S10= K S11= U S12= X
パターンはDATA_POINTS
ファイル内で繰り返されず、正確に一致する必要があります。
最近のソリューション
他のqsnからこのコマンドを受け取りました。列6が同じ行パターンにある場合に機能します。
awk '/DATA_POINTS/{i==0 ; i++; getline; print "S"i"=", $6}' File-1
答え1
次のawk
プログラムがこれを行う必要があります。
awk 'BEGIN{n=-1}
n>0{printf "S%-*d=%s\n",w,++i,$6; if (i==n) {i=0;n=-1}}
n==0{n=$1;w=length($1)}
$0=="DATA_POINTS"{n=0}' file
これは次のことを行います。
- 最初は、「データブロックの外側」を意味する
n
「ステータスフラグ」が初期化されます。-1
DATA_POINTS
文字列のみで構成された行が見つかった場合は、「次の行にデータポイントの数が含まれます」という意味にn
設定します。0
- 0の場合、
n
行の内容はデータポイント数として解釈され、に保存されますn
。数値の長さ(文字/数字)は、w
後で出力形式を指定するために使用されるフィールドに保存されます。 n
より大きい場合は、「0
データ」ブロック内にあることを示し、count変数i
(固定幅で書式設定w
および出力例で左に調整)と同じにi
なるまで、行の6番目のフィールドを使用して「キー」を印刷しますn
。n
リセット-1
これは、ファイルの終わりにないデータの集まりを処理できるため、必要以上に強力です(単にファイルの最後まで読み込むのではなく、ヘッダーで指定されたデータ行の数を尊重します)。
ノート現在の検索方法はDATA_POINTS
完全な文字列一致であり、これは実際の文字列に特殊文字を含めることができる場合に最も強力な方法です。部分文字列一致または正規表現一致が必要な場合は、次のようにします。
index($0,"DATA_POINTS") { ... }
または(あなたの例のように)
/DATA_POINTS/ { ... }
また、空白行の誤解を防ぐために、およびをn>0
それぞれn==0
に置き換えます。n>0&&NF
n==0&&NF
答え2
$ awk '/DATA_POINTS/{c=3} c&&!--c{f=1} f{printf "S%d = %s\n", ++s, $6}' file
S1 = A
S2 = B
S3 = C
S4 = D
S5 = E
S6 = F
S7 = U
S8 = W
S9 = L
S10 = K
S11 = U
S12 = X
3行ではなく一致する行(含む)の27行で印刷を開始するには、3を27に変更します。
バラよりhttps://stackoverflow.com/questions/17908555/printing-with-sed-or-awk-a-line-following-a-matching-pattern/17914105#17914105上記の方法に関する詳細情報と、ゲームの終了後に実行できるより多くの方法を学びます。
答え3
範囲演算子を使用してください,
。データポイント行で始まり、eofで終わります。
awk '
/DATA_POINTS/,0 {
if ( /DATA_POINTS/ ) {
getline; next
}
printf "S%-2d=%s%s\n", ++k, OFS, $6
}
' file
答え4
これは、sedを使用して行番号、bc + 2、tailを使用してデータの塊を抽出し、最後にawkを使用して正しい列を取得する1行のソリューションです。おそらく最もクリーンまたはシンプルなソリューションではありませんが、私にとってはawkを使用するよりもきれいです。
sed -n '/DATA_POINTS/=' $file | xargs -i echo '{}+2' | bc | xargs -i tail -n+{} $file | awk '{print $6}'