1

次の形式のテキスト ファイルがあります。各行には可変数の列があります。

ファイル:

gi|269201691|ref|YP_003280960.1| chromosomal replication initiation protein                                                            gi|57651109|ref|YP_184912.1| chromosomal replication initiation protein                                                                   %           1        0.0           2296      100.0
gi|269201692|ref|YP_003280961.1| DNA polymerase III subunit beta                                                                       gi|57651110|ref|YP_184913.1| DNA polymerase III subunit beta                                                                              %           1        0.0           1964      100.0

結果のファイルは次のようになります。

gi|269201691|ref|YP_003280960.1| gi|57651109|ref|YP_184912.1| % 1        0.0           2296      100.0
gi|269201694|ref|YP_003280963.1| gi|57651112|ref|YP_184915.1| % 1        0.0           1767      100.0

以下のコードは、パターン「ref」で各行の列を見つけるのに役立ちます。

awk '{for (i=1;i<=NF;i++) if ($i ~ /ref/) print $i }'

同じことをする方法についてのアイデアはありますか?

4

3 に答える 3

1

投稿で改行が壊れていて、入力ファイルには実際には 1 行に 1 つのエントリしかないと仮定しています。その場合、これはあなたが望むことをすると思います:

awk -F '[|%]' '{printf("%s|%d|%s|%s|",$1,$2,$3,$4);if($6)printf(" %%%s",$6);printf("\n")}'

編集:わかりました、新しい行番号に照らして、あなたが望むのはおそらくこれです:

awk -F '[|%]' '{printf("gi|%d|ref|%s|gi|%d|ref|%s| %%%s\n",$2,$4,$6,$8,$10)}'

あなたの例では、これにより次の出力が生成されます

gi|269201691|ref|YP_003280960.1|gi|57651109|ref|YP_184912.1| % 1 0.0 2296 100.0
gi|269201692|ref|YP_003280961.1|gi|57651110|ref|YP_184913.1| % 1 0.0 1964 100.0

これは、フィールド セパレータを手動で | に設定することで機能します。また %。したがって、説明内の可変数の単語はもはや問題ではなく、必要なフィールドに直接インデックスを付けることができます。

于 2012-10-29T13:46:05.610 に答える
0

を使用する 1 つの方法を次に示しGNU awkます。

awk 'BEGIN { OFS=FS="|" } { for (i=1; i<=NF; i++) if ($i ~ / gi$/) $i = " gi"; if (i = NF) sub(/.*%/," %",$i) }1' file.txt

を使用する 1 つの方法を次に示しGNU sedます。

sed 's/|[^|]* gi|/| gi|/; s/\(.*|\).*\(%.*\)/\1 \2/' file.txt

結果:

gi|269201691|ref|YP_003280960.1| gi|57651109|ref|YP_184912.1| % 1 0.0 2296 100.0
gi|269201692|ref|YP_003280961.1| gi|57651110|ref|YP_184913.1| % 1 0.0 1964 100.0
于 2012-10-29T22:10:06.557 に答える
0

これはうまくいくかもしれません(GNU sed):

sed 's/\(.*|.*|.*|.*|\)\(.*\)\(\S\+|.*|.*|.*|\)\2%/\1\3%/' file

入力ファイルに複数行のレコードがある場合:

sed 'N;s/\n//;s/\(.*|.*|.*|.*|\)\(.*\)\(\S\+|.*|.*|.*|\)\2%/\1\3%/' file
于 2012-10-29T14:41:58.513 に答える