私のファイルにテストデータがあります。text.txt
a
b
test
test2
1,2
3,3
test+2行からファイルを出力したいです。で使用できるワンライナーでこれが必要ですgnuplot
。次のことを思い出しました。
awk -v linestart=$(awk '$0~"test" {a=NR}END{print a+2}' $filename) 'BEGIN{FS=",";OFS="\t";lines}NR>=linestart{print $1, $2}' $filename
しかし、どういうわけかファイルの内容を両方に供給する必要がありますが、awk
方法がわかりません。それで解決策を見つけましたが、どのように$filename
入るのか問題がありました$filename
。
私の考えはこんな感じです。
echo "test.txt" | read filename | awk -v linestart=$(awk '$0~"test" {a=NR}END{print a+2}' $filename) 'BEGIN{FS=",";OFS="\t";lines}NR>=linestart{print $1, $2}' $filename
しかし、これはうまくいきません。
上記の作業をどのように実行できますか?明らかな問題は、印刷を実行する前に印刷を開始する行番号を知る必要があることですawk
。私もいくつか考えています:
awk 'BEGIN{FS=",";OFS="\t";lines=100000}{if ($0~"test"){lines=NR+2}; if(NR>=lines){print $1, $2}}'
しかし、非常に醜くて一般的ではないので、試してさえしませんでした。変数をlines
常に十分に大きくする必要があります。それでは、プレーンテキストファイルパイプで動作するエレガントなソリューションはありますか?それとも別の場合は、ファイル名をパイプにプッシュする方法はありますか?
答え1
使用ed
:
$ printf '%s\n' '/^test/+2,$p' | ed -s file
1,2
3,3
ed
エディタでは、このコマンドは一致する行の2行を行の末尾()まで/^test/+2,$p
印刷します()。p
^test
$
使用awk
:
$ awk '/^test/ { flag = 1; count = 1 }; (flag == 1 && count <= 0); { count-- }' file
1,2
3,3
flag
ここで が 1 でcount
0 以下の場合、1 行が印刷されます。このフラグは、^test
入力データのパターンが一致したときに1に設定され、出力がcount
開始される前にスキップされた行数にも設定されます(現在の行は計算されません)。count
すべての行の値が減少します。
わずかに異なるアプローチawk
:
$ awk '/^test/ { getline; while (getline > 0) print }' file
1,2
3,3
ここでは、パターンを一致させた直後に次の入力行を読み取ってしまいます。次に、whileループを使用してファイルの残りの部分を読み取り、読み取った各行を印刷します。
まったく同じ方法ですが、以下を使用してくださいsed
。
$ sed -n -e '/^test/ { n' -e ':again' -e 'n; p; b again' -e '}' file
1,2
3,3
パターンが一致したら、次の行を読み取って削除し(n
)、ループを入力して各行を読み取り、印刷します(n; p;
)。ループはラベルagain
とそのラベルへの分岐/ジャンプ()で構成されていますb again
。
答え2
test
データが2行目以降に始まり、上記の行がもうないことがわかっている場合は、test
次のようにできます。
awk '/^test$/ { f=1 } f && f++ > 2' filename
または、このデータをGnuplotに送信するには、次のパイプラインを介して実行することを検討できます。
(
echo "set datafile separator ','"
echo "plot '-' using 1:2 with lines"
awk '/^test$/ { f=1 } f && f++ > 2' filename
echo "e"
) | gnuplot -persist
答え3
常に false の終了条件と行をスキップする開始条件のある範囲を使用するstart, end
と、これを達成できます。
awk '/test/ && getline && getline, 0'
答え4
$ awk '/test/{n=NR} n && NR>n' file
1,2
3,3
$ awk '/test/{n=NR+1} n && NR>n' file
3,3
また、見ることができますhttps://stackoverflow.com/a/17914105/1745001