
私はここや他のいくつかの場所をくまなく調べて、この答えを見つけようとしましたが、あまりにも単純なので誰も答えてくれませんでした。私がする必要があるのは、各行の末尾に新しい列に単一の値を追加することだけです。私が見つけた最も近い方法は、を使用することですsed -i "s/$/green/" ./test.txt
が、これは次の行に緑の値を追加します。現在の最終列の後に新しい列として追加する必要があります。
次のようなファイルがあります:
chr - xyz ordered_A01 5480 6144
chr - xyz ordered_A01 5480 58001
次のようにする必要があります:
chr - xyz ordered_A01 5480 6144 green
chr - xyz ordered_A01 5480 58001 green
しかし、代わりに次のメッセージが表示されます:
chr - xyz ordered_A01 5480 6144
green
chr - xyz ordered_A01 5480 5801
green
答え1
質問にある sed コマンドは実際には正しいです。新しい行に結果が表示される場合は、ターミナルが narrow に設定されていて wrap のみが表示されているか、この例では示されていない実際の環境に含まれているコードがあります。そのままでも動作しますが、注意すべき問題が 2 つあります。
二重引用符で囲まれた文字列内で式の一部として を使用すること
$
は危険です。通常、これは bash 変数として展開されます。この場合、/
その後の文字は有効な値の名前ではないため、問題なく処理されましたが、これを回避するには、式の周囲に一重引用符を使用する必要がありました。列として整列させたい場合は、行の末尾と追加する値の間に何らかの区切り文字を含める必要があります。タブを使用するのが最も簡単な方法ですが、他のフィールド間に既にある区切り文字を使用することをお勧めします。
組み合わせると、修正されたコマンドは次のようになります。
sed -i 's/$/\tgreen/' ./test.txt
結果が希望どおりに整列しない場合は、データをパイプしてcol
列を整列させることを検討してください。
表示されていないものに関しては、問題はおそらくデータ ファイルにあります。コメントで Wordpad と Excel について言及されているので、Windows/Unix の混在環境を使用していると思います。データ ファイルの行末の前に、印刷されない不要なシーケンスが含まれていることが問題だと思います。これをクリーンアップするために何らかの操作を行う必要があります。最初は単純なsed 's/\s*$//'
方法 (最後の改行を除く行末のすべての空白文字を削除する) から始めるのがよいでしょうが、dos2unix コンバーターなどのより高度なシステムを使用すると、より良い結果が得られる場合があります。バイナリの不要なデータが含まれていて、ファイルが ASCI テキストであるはずである場合は、を使用して範囲外のすべてを消去してみてくださいtr -cd '\11\12\15\40-\176'
。
答え2
次のように使用できますawk
:
awk '{printf "%s", $0 "\tgreen\n"}' infile > outfile
答え3
Vim を Ex モードで使用できます:
ex -sc '%s/$/\tgreen/|x' test.txt
%
すべての行を選択\t
タブx
保存して閉じます