0

読み取るデータファイルがあります

field1 field2 diseased 
discrete discrete   discrete                                                    
                    class
No Yes No 
Yes Yes Yes
No No No

最後の列を除くすべての列の No を疑問符 (?) に置き換えたいです。これは、数千の列を持つデータがある 3 つの列を持つ単なるおもちゃの例です。だから、個人でやっても意味がありません。また、最初の 3 行はヘッダーであり、そのまま使用します。だから私は私の結果が

field1 field2 diseased 
discrete discrete   discrete                                                    
                    class
? Yes No 
Yes Yes Yes
? ? No

ファイルのフォーマットを変更せずにこれを行いたい。これまでのところ、最後の列を削除して No を置き換え、最後の行を再度追加することでこれを行うことができますが、書式設定は失われます。また、助けてくれてありがとう。はいの数が多く、最後の列がいいえの場合、いくつかのタブが最後に追加されます。指示

cat -e test 

結果は

field1 field2 diseased 
discrete discrete   discrete                                                    
                    class
? Yes No$
Yes Yes Yes
? ? No
Yes Yes No $

最後の No と $ の間にスペースを入れたくない

4

5 に答える 5

3

他のヘッダーが一致する可能性がある場合を除きNo、次のような非常に単純なもので回避する必要があります。

perl -pwe 's/\bNo\b(?!\s*$)/?/g' infile > outfile

No周囲に単語境界があるすべての文字列を置き換えます。シェルのリダイレクトにより、出力が新しいファイルに保存されます。スイッチを使用することもできますが、-i通常、新しいユーザーにはお勧めしません。

否定先読みアサーションを使用して、それが行の最後の一致ではないことを確認します。

于 2013-11-11T11:35:22.113 に答える
2

awk を使用します。

awk -v ccol=3 '{for (i=1; i<=NF; i++) if (i != ccol && $i=="No") $i="?"} 1' OFS='\t' file

ccol置き換えられる列をスキップするために任意の値を渡すことができます。

于 2013-11-11T11:31:37.673 に答える
1

ここでは、最後の列を置き換えてはいけないと考えています (これは、必要に応じて簡単に変更できます)。

awk の使用:

[ ~]$ awk '{for (i=1;i<NF;i++){if ($i=="No"){$i="?"}}; print $0}' test.txt 
field1 field2 diseased 
discrete discrete   discrete                                                    
                    class
? Yes No
Yes Yes Yes
? ? No

sed の使用:

[ ~]$ sed "s/No/\?/g; s/\?\ *$/No/g" test.txt 
field1 field2 diseased 
discrete discrete   discrete                                                    
                class
? Yes No
Yes Yes Yes
? ? No
于 2013-11-11T11:51:11.937 に答える
0

awk

awk '$1=="No" {$1="?"} $2=="No" {$2="?"} 1' file
于 2013-11-11T11:33:00.303 に答える