私はこの質問に対する答えを見つけるためにここと他のいくつかの場所を検索してみましたが、あまりにも簡単で誰も答えませんでした。私がしなければならないのは、新しい列の各行の末尾に単一の値を追加することだけです。私が見つけた最も近いものはを使用することですが、これを行うと、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コマンドは実際には正しいです。新しい行に結果が表示された場合は、端末が狭く設定され、改行のみが表示されるか、実際の環境にはこの例には表示されていないコードが含まれています。現状のまま動作しますが、知っておくべき2つの問題があります。
$
二重引用符で囲まれた文字列内で式の一部として使用するのは危険です。通常、bash変数に展開されます。この場合、後続の文字は有効で価値のある名前ではないため、エスケープしますが、/
これを回避するには式の周りに一重引用符を使用する必要があります。内容を列に並べ替えるには、行末と追加する値の間に一種の区切り文字を含める必要があります。タブ文字はこれを行う最も簡単な方法ですが、異なるフィールド間に既に存在する区切り文字を使用する必要があります。
結合された固定コマンドは次のとおりです。
sed -i 's/$/\tgreen/' ./test.txt
結果が必要に応じてソートされない場合は、データをパイピングしてcol
列をソートすることを検討できます。
あなたが私たちに示さないことはあなたのデータファイルに問題があるかもしれません。あなたの意見でワードパッドと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
ExモードでVimを使用できます。
ex -sc '%s/$/\tgreen/|x' test.txt
%
すべての行を選択\t
商標x
保存して閉じる