上下の3段階の値より少なくとも2倍大きい値を同じ列に印刷します(続き1)。

上下の3段階の値より少なくとも2倍大きい値を同じ列に印刷します(続き1)。

私にテーブルがあります。

A 1
A 1
A 1
A 1
A 1
A 1
A 2
B 1
B 1
B 1
B 2
B 1
B 1
B 1

列2の値が同じ列で、上記の3段階と下の3段階より少なくとも2倍大きい列1の行を印刷したいと思います。ただし、列1の同じ名前の行のみが考慮されます。

したがって、出力は次のようになります。

B

上記の太字の追加要件を満たすために、Stéphane Chazelasによって書かれたこのスクリプトを修正したいと思います。

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

(実際に続く投稿ですここ。状況が複雑なので、ここではよりよく説明したいと思います。 )

。 。 。

20171010アップデート:

私は現在Stéphane Chazelasによって書かれたスクリプトを修正していますが、今私が選択した行の値は次のようになります。上記の3番目の値と下の3番目の値より少なくとも2倍小さいです。。以前は、私が自分で理解し、スクリプトを修正しようとした例を単純化していましたが、失敗しました...もう少し簡単にv2 <= v1/2 && v2 <= v3/2説明するために、次のように実際のファイルを提供します。ここで、2番目の列の値は役に立ちません3番目の列の値を比較します:

K00188:14:H2LMFBBXX:6:1101:27440:1668   1   2
K00188:14:H2LMFBBXX:6:1101:27440:1668   2   2
K00188:14:H2LMFBBXX:6:1101:27440:1668   3   2
K00188:14:H2LMFBBXX:6:1101:27440:1668   4   1
K00188:14:H2LMFBBXX:6:1101:27440:1668   5   1
K00188:14:H2LMFBBXX:6:1101:27440:1668   6   1
K00188:14:H2LMFBBXX:6:1101:27440:1668   7   1
K00188:14:H2LMFBBXX:6:1101:27440:1668   8   1
K00188:14:H2LMFBBXX:6:1101:27440:1668   9   1
K00188:14:H2LMFBBXX:6:1101:27440:1668   10  1
K00188:14:H2LMFBBXX:6:1101:6501:1686    1   2
K00188:14:H2LMFBBXX:6:1101:6501:1686    2   2
K00188:14:H2LMFBBXX:6:1101:6501:1686    3   2
K00188:14:H2LMFBBXX:6:1101:6501:1686    4   1
K00188:14:H2LMFBBXX:6:1101:6501:1686    5   1
K00188:14:H2LMFBBXX:6:1101:6501:1686    6   1
K00188:14:H2LMFBBXX:6:1101:6501:1686    7   2
K00188:14:H2LMFBBXX:6:1101:6501:1686    8   2
K00188:14:H2LMFBBXX:6:1101:6501:1686    9   2
K00188:14:H2LMFBBXX:6:1101:6501:1686    10  2

行全体を印刷すると、予想される出力は次のようになります。

K00188:14:H2LMFBBXX:6:1101:6501:1686    4   1
K00188:14:H2LMFBBXX:6:1101:6501:1686    5   1
K00188:14:H2LMFBBXX:6:1101:6501:1686    6   1

これは私の失敗した修正です。

awk -v key=1 -v value=3 '
  NR > 6 {
    k1 = saved_key[NR%6];   k2 = saved_key[(NR - 3) % 6];   k3 = $key
    v1 = saved_value[NR%6]; v2 = saved_value[(NR - 3) % 6]; v3 = $value
    if (k1 == k2 && k2 == k3 && v2 <= v1/2 && v2 <= v3/2) print $0
  }
  {saved_key[NR % 6] = $key; saved_value[NR % 6] = $value}' < test

どうすれば修正できますか?

。 。 。

20171011アップデート:

追加キーを追加するにはどうすればよいですか?3列の値を4列上下の3番目の値(つまり他の列)と比較します。? 20171011アップデートを参照してください。もう一度ありがとうございます!

K00188:14:H2LMFBBXX:6:1101:27440:1668   1   0   2
K00188:14:H2LMFBBXX:6:1101:27440:1668   2   0   2
K00188:14:H2LMFBBXX:6:1101:27440:1668   3   0   2
K00188:14:H2LMFBBXX:6:1101:27440:1668   4   1   0
K00188:14:H2LMFBBXX:6:1101:27440:1668   5   1   0
K00188:14:H2LMFBBXX:6:1101:27440:1668   6   1   0
K00188:14:H2LMFBBXX:6:1101:27440:1668   7   1   0
K00188:14:H2LMFBBXX:6:1101:27440:1668   8   1   0
K00188:14:H2LMFBBXX:6:1101:27440:1668   9   1   0
K00188:14:H2LMFBBXX:6:1101:27440:1668   10  1   0
K00188:14:H2LMFBBXX:6:1101:6501:1686    1   0   2
K00188:14:H2LMFBBXX:6:1101:6501:1686    2   0   2
K00188:14:H2LMFBBXX:6:1101:6501:1686    3   0   2
K00188:14:H2LMFBBXX:6:1101:6501:1686    4   1   0
K00188:14:H2LMFBBXX:6:1101:6501:1686    5   1   0
K00188:14:H2LMFBBXX:6:1101:6501:1686    6   1   0
K00188:14:H2LMFBBXX:6:1101:6501:1686    7   0   2
K00188:14:H2LMFBBXX:6:1101:6501:1686    8   0   2
K00188:14:H2LMFBBXX:6:1101:6501:1686    9   0   2
K00188:14:H2LMFBBXX:6:1101:6501:1686    10  0   2

行全体を印刷すると、予想される出力は次のようになります。

K00188:14:H2LMFBBXX:6:1101:6501:1686    4   1   0
K00188:14:H2LMFBBXX:6:1101:6501:1686    5   1   0
K00188:14:H2LMFBBXX:6:1101:6501:1686    6   1   0

これは私の裁判です:

awk -v key1=1 -v key2=2 -v value1=3 -v value2=4 '
    {
    k1 = saved_key1[NR%6];   k2 = saved_key1[(NR - 3) % 6];   k3 = $key1
    k4 = saved_key2[NR%6];   k5 = saved_key2[(NR - 3) % 6];   k6 = $key2
    v1 = saved_value1[NR%6]; v2 = saved_value1[(NR - 3) % 6]; v3 = $value1
    v4 = saved_value2[NR%6]; v5 = saved_value2[(NR - 3) % 6]; v6 = $value2
    if (k1 == k2 && k2 == k3 && v2 <= v4/2 && v2 <= v6/2) print saved_record[(NR-3)%6]
  }
  {saved_key1[NR % 6] = $key1; saved_value1[NR % 6] = $value1}' < file

ベストアンサー1

それから:

awk -v key=1 -v value=2 '
  NR > 6 { # for 7th record and over only
    k1 = saved_key[NR%6];   k2 = saved_key[(NR - 3) % 6];   k3 = $key
    v1 = saved_value[NR%6]; v2 = saved_value[(NR - 3) % 6]; v3 = $value
    if (k1 == k2 && k2 == k3 && v2 >= 2*v1 && v2 >= 2*v3) print k2
  }
  # for every record, save key and value in ring buffers:
  {saved_key[NR % 6] = $key; saved_value[NR % 6] = $value}'

ANDの比較は、k1 == k2値が数値のように見える場合(したがって同じと見なされる)、数値で比較され、そうでない場合はテキストで比較されます。テキスト比較を強制するように変更されました。k2 == k3000k1 "" == k2

あるいは、履歴全体を保存し、検査中に再分割することもできます。あなたのように20171010アップデート:

awk -v key=1 -v value=3 '
  NR > 6 {
    # "above" is an array with the fields of 6th last record
    split(saved_record[NR%6], above)
    # "text" is the 3rd last record and the one we will be looking at
    text = saved_record[(NR - 3) % 6]
    # "text" fields split into the "here" array.
    split(text, here)
    # $0 contains the current record (the one 3 lines below "here")
    # and $1, $2, $3... the fields of that record.
    if (above[key] == here[key] && here[key] == $key && \
        here[value] <= above[value] / 2 && here[value] <= $value / 2)
      print text
  }
  {saved_record[NR % 6] = $0}'

おすすめ記事