私にテーブルがあります。
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 == k3
00
0
k1 "" == 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}'