2

ここにリンクしたようなデータセットがあります: http://pastebin.com/7tpBAqua

最初の 2 行はデータ (数値) ではないことに注意してください。これにもかかわらず、2 行目は 3 行目に関連付けられています。同様に、4 行目は 5 行目に関連付けられます。

現在、しきい値を超えたすべての行番号 (-1 未満および 1 を超えるもの) に関する情報を出力する awk スクリプトがあります。これが出力です。

71
72
88
98
99
.... and so on...

数字が偶数の場合、その後に奇数の数字を出力する必要があります (つまり、72 の場合、72 の新しい行を出力し、次に 73 を出力します)。

数値が奇数の場合、その前に偶数を出力する必要があります (つまり、99 の場合は 98 の新しい行を出力し、次に 99 を出力します)。

70
71
72
73
88
89

など…</p>

繰り返しになりますが、このデータセットにノイズが見つかっているため、研究が有効であるためにはノイズを除去する必要があります。ご協力いただきありがとうございます。

編集:以下に提供されている解決策から、私自身の個人的な学習と、これを読む可能性のある他の人のために、それを分解することにしました:

"awk -F'[ ,]' 'NR>2{for (i=2;i<=NF;i++) if ($i<-1 || $i>1) print (NR%2==0) ? NR ORS NR + 1 : NR - 1 ORS NR; next }' file.txt

まず、基本的なアルゴリズムを作成します。

if (cur == even)
  print cur + \n + prev 
else if (cur == odd)
  print prev + \n + cur

-F'[ ,]'   # a flag for field seperator and designating it with [ ,]

'NR>2      # The total Number of input Records seen so far. 

{for (i=2;i<=NF;i++) # for loop starting at 2, ending when greater or equal to NR

if ($i<-1 || $i>1) # when these conditions are met then 

print (NR%2==0)    # print NR modulus 2

? 

NR ORS NR + 1      # current OR next

: NR - 1 ORS NR;   # comparisons?

next }'            # now go to the next NR

file.txt           # save to file.txt
4

2 に答える 2

3

使用方法の 1 つGNU awkは次のとおりです。一部のユーザーは以前のコードを使用しています。

awk -F'[ ,]' 'NR>2{for (i=2;i<=NF;i++) if ($i<-1 || $i>1) print (NR%2==0) ? NR ORS NR + 1 : NR - 1 ORS NR; next }' file.txt
于 2012-10-30T00:19:19.873 に答える
2

この質問から元のコードを取得し、NRのパリティをテストする条件を入力します。(パリティは偶数または奇数のプロパティであり、モジュラス演算子を使用してテストされます:%)。

awk -F'[ ,]' 'NR>2{for (i=2;i<=NF;i++) if ($i>=-1 || $i<=1) { if(NR%2 == 0) { print NR+1 } else { print NR-1} ; next } }' 
于 2012-10-29T23:55:24.090 に答える