列を追加

列を追加

私はこの質問に対する答えを見つけるためにここと他のいくつかの場所を検索してみましたが、あまりにも簡単で誰も答えませんでした。私がしなければならないのは、新しい列の各行の末尾に単一の値を追加することだけです。私が見つけた最も近いものはを使用することですが、これを行うと、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つの問題があります。

  1. $二重引用符で囲まれた文字列内で式の一部として使用するのは危険です。通常、bash変数に展開されます。この場合、後続の文字は有効で価値のある名前ではないため、エスケープしますが、/これを回避するには式の周りに一重引用符を使用する必要があります。

  2. 内容を列に並べ替えるには、行末と追加する値の間に一種の区切り文字を含める必要があります。タブ文字はこれを行う最も簡単な方法ですが、異なるフィールド間に既に存在する区切り文字を使用する必要があります。

結合された固定コマンドは次のとおりです。

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
  1. %すべての行を選択

  2. \t商標

  3. x保存して閉じる

関連情報