リストがあります。
2
2
2
3
2
2
2
4
2
2
2
上と下の3段階の値より少なくとも2倍大きい値を同じ列に印刷したいと思います。
出力は
4
どうすればいいですか?私も同様の質問をしました。ここ、よりよく説明するためにここに書いています。ありがとうございます。
20171006更新:実際の入力ファイルを過度に単純化して申し訳ありません。実際にはリストではなくテーブルです。複数の列(列2、3、4など)から選択し、列1を印刷する必要があります。その列に対してこのようなスクリプトの情報をどのようにマージしますか?
A 2 2 2
B 2 2 2
C 2 2 2
D 3 3 3
E 2 2 2
F 2 2 2
G 2 2 2
H 4 4 4
I 2 2 2
J 2 2 2
K 2 2 2
そして得る
H
ベストアンサー1
でこれを行うことができますawk
。 3行目と最後の行を6行目と現在の行とを比較するには、最初の6行を保存する必要があります。これの一般的なトリックは、保持したい行数にインデックス付きの配列であるNR%6
リングバッファを使用することです6
。
awk '
NR > 6 {
x = saved[NR%6]; y = saved[(NR - 3) % 6]; z = $0
if (y >= 2*x && y >= 2*z) print y
}
{saved[NR % 6] = $0}' < file
編集するには:比較するキーと値を保存します。
awk -v key=1 -v value=2 '
NR > 6 {
x = saved_value[NR%6]; y = saved_value[(NR - 3) % 6]; z = $value
if (y >= 2*x && y >= 2*z) print saved_key[(NR - 3) % 6]
}
{saved_key[NR % 6] = $key; saved_value[NR % 6] = $value}' < file
どこkey
に印刷する列のインデックスとvalue
比較する値を含む列があります。
または、2、3、4列(平均など)に基づいて目的の指標を選択します。
awk '
{metric = ($2 + $3 + $4) / 3}
NR > 6 {
x = saved_metric[NR%6]; y = saved_metric[(NR - 3) % 6]; z = $metric
if (y >= 2*x && y >= 2*z) print saved_key[(NR - 3) % 6]
}
{saved_key[NR % 6] = $key; saved_metric[NR % 6] = $metric}' < file