1

次のようなファイルがあります。

A 50.40,60.80,56.60,67.80,51.20,78.40,63.80,64.2
B 37.40,37.40,38.40,38.80,58.40,58.80,45.00,44.8
.
.
.

列 2 のすべての値が 50 を超える行を印刷したい

出力:

A 50.40,60.80,56.60,67.80,51.20,78.40,63.80,64.2

私は試した:

cat file | tr ',' '\t' | awk '{for (i=2; i<=NF; i++){if($i<50) continue; else print $i}}'
4

2 に答える 2

2

タグを意味していることを願っています。

tab <- read.table("file")
splt <- strsplit(as.character(tab[[2]]), ",")
rows <- unlist(lapply(splt, function(a) all(as.numeric(a) > 50)))
tab[rows,]

これにより、ファイルがスペース区切りのテーブルとして読み取られ、2 番目の列が個々の値に分割され (文字ベクトルのリストが生成されます)、すべての値が > 50 であるかどうかに応じて、そのような各行の論理値が計算されます。結果は論理ベクトルに結合され、データのサブセット化に使用されます。

于 2013-04-26T07:42:41.810 に答える
2

FSフィールド区切り文字は任意の正規表現にすることができるため、アプローチにコンマを含めると次のようになります。

awk '{ for(i=2; i<=NF; i++) if($i<=50) next } 1' FS='[ \t,]+' infile

出力:

A 50.40,60.80,56.60,67.80,51.20,78.40,63.80,64.2

説明

for ループは 2 番目の列のカンマ区切りの値を処理し、それらのいずれかが 50 以下の場合nextは実行されます。つまり、次の行にスキップします。最初のブロックが渡さ1れると、 true と評価されてデフォルト ブロックを実行する が検出されます{ print $0 }

于 2013-04-26T09:30:32.950 に答える