2011-08-08 8 views
1

と行の末尾にスペース文字を置き換えます。私は6つのフィールドを持つスペース区切りのファイルを扱っています特定の文字列

Pop1 ID60776 62 C 10 62 
Pop1 ID62442 13 A 2 13 
Pop1 ID63614 56 C 0 
Pop1 ID67511 61 T 37 61 
Pop1 ID68222 51 A 0 
Pop1 ID68407 65 C 16 65 

しかし、ライン3と5で、唯一の5つのフィールドがあります。これらの場合、フィールド5の0の後にスペース文字( '0')が続きます。

スペース文字のすべてのインスタンスを行末(つまり\ s $)に配置し、スペースNA(つまり '\ sNA')に置き換えたいのですが、実際に問題が発生しています。たとえば、私はsedを試みました:

sed s/\\s$/\\sNA/g 

しかし、それは動作していません。誰かが私を助けることができますか?

ありがとうございました!

答えて

2

ここawkで同等のソリューションのカップルがあります:

awk '{ printf("%s", $0) } NF == 5 { printf("NA") } { printf("\n") } 

awk '{ print $0 (NF==5 ? "NA" : "") }' 
2
  1. \sはクラスであるため、置換文字列では使用できません。
  2. $はおそらくシェルによって解釈されています。

試してみてください。

sed -e's/\s$/ NA/' 
+0

こんにちはダグラス、返事をありがとう!私はこの方法で空白文字を入力しようとしましたが、エラーが発生します。 sed:-e式#1、char 5:終了していない 's 'コマンド – susjoh

+0

お詫び!これはうまくいきます - 別のプログラムでコマンドを呼び出していて、一重引用符を使用していませんでした。私のWindowsの習慣は壊れにくいです! – susjoh

2

実空間の代わりに、\ S、および使用を入れて一重引用符(')からavoi D変数置換を実行するためのシェル:

sed -e 's/ $/ NA/' 
+0

jfgagneありがとうございました。一重引用符で固定しました。 – susjoh

2

あなたはSEDやawkのプロセスを開始するために避け、純粋なbashシェルであることを行うことができます。

while read line; do 
    printf "%s" "$line" 
    nbchar=${#line} 
    if [ ${line:$((nbchar-1))} == " " ] ; then printf "NA"; fi 
    printf "\n" 
done < your_file 
+1

これは少しシンプルかもしれません: 'case" $ line "in(*" ")echo" $ {line} NA ";; (*)echo "$ line" ;;エサック –

関連する問題