上と下の手順3の値より少なくとも2倍大きい値を同じ列に印刷します。

上と下の手順3の値より少なくとも2倍大きい値を同じ列に印刷します。

リストがあります。

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

おすすめ記事