3

Trying to get a bit more out of the command line:

I have a file:

CHR25   1192279 Y       Exonic  NA      exon    2       [1/1]   1192145 1192322
CHR25   1192279 Y       Exonic  NA      CDS     2       [1/1]   1192145 1192322  
CHR25   1739394 Y       Exonic  NA      CDS     2       [1/2]   1739294 1739456

I want to get unique lines based on column 2. I have done

cat file | cut -f 2 | uniq > grepfile

but am unsure of how to now get one match per line using grep -f as I previously have. Using -m1 or | head -n 1 only gives the first matching line. I want the first line to match each line in 'grepfile'.

Look forward to answers=)

4

4 に答える 4

6

この awk コマンドは、既に表示されている 2 番目のフィールド値の連想配列を作成することによって機能します。

awk '!s[$2]++'

連想配列は と呼ばれsます。この式は $2 (入力行の 2 列目) を検索し、ポストインクリメントを適用します。これは、最初に呼び出されたときに 0 を返し、その後はゼロ以外を返します。次に、それを逆にして、最初に $2 が表示されるたびに 1 を生成し、その後は毎回 0 を生成します。awk のデフォルトのアクションは、選択式が true の場合に出力することです。

行数が再び 0 に戻るほど大きい場合は注意してください。

于 2012-07-02T11:29:06.687 に答える
2

これも機能します:

sort -u  -k2,2 file

与える:

CHR25   1192279 Y       Exonic  NA      exon    2       [1/1]   1192145 1192322
CHR25   1739394 Y       Exonic  NA      CDS     2       [1/2]   1739294 1739456

-uを呼び出します。これは、ソートのマニュアルページに表示されているように、フィールド2(およびフィールド2のみ)でソートすることを意味しuniqます。-k2,2

于 2012-07-02T11:46:08.927 に答える
0

Perl に問題がなければ、次のことができます。

perl -nale '$h{$F[1]}=$_ if(!$h{$F[1]});END{print $h{$_}for(keys(%h));}' file
于 2012-07-02T11:17:04.997 に答える
0

uniq は隣接する行のみを調べ、並べ替えによって順序が変更されるためです。もう少しコードが必要です。

cat -n input-file | sort --key=3,3 --unique | sort | cut -f2- >output-file
  1. cat -nシーケンス番号を追加します。
  2. sort --key=3,3 --uniqueフィールド 2 の重複を削除します。注: のため、キー番号が 1 つ大きくなりcat -nます。
  3. sort元の順序に戻すこと。
  4. cut -f2-シーケンス番号のリグを取得します。
于 2012-07-02T11:57:38.783 に答える