
10列のタブで区切られたファイルがあり、列の1つ(約4000万行あり)に各行の既存の項目の前に単語を追加し(各行に同じ単語!)、1つを追加したいと思います。;
入場後。
たとえば、最初の2行は
1 2 3 4 5 6 7 8 text still more text in this column 10
1 2 3 4 5 6 7 8 text2 still more text in this column 10
到着
1 2 3 4 5 6 7 8 test=text; still more text in this column 10
1 2 3 4 5 6 7 8 test=text2; still more text in this column 10
最終的にこれはExcelの基本的な「接続」機能ですが、このような大きなファイルにはExcelを使用できず、とにかくLinuxに移動する必要があります。
フォーラムで接続の問題を調査しましたが、2つの文字列をマージすることに関するトピックのみが見つかりました。
foo="Hello"
foo="$foo World"
echo $foo
ただし、変数を使用しないでください。
答え1
これが正しいawk
良いこと:
awk -F'\t' -vOFS='\t' '{ $9 = "test=" $9 ";" }1'
-F'\t'
タブで区切られたフィールドを使用するように指示します。-vOFS='\t'
出力にもタブ文字を使用するように指示します。実際の本体は最後のパラメータです。各行が(9番目のフィールド)の値を$9
「test =」、元の値、および「;」の連結に変更すると言う小さなプログラムです。他のすべてのフィールドは変更せずに残し、最後に何かをしても新しい行を印刷するように1
指示します。awk
私が入力(タグの挿入)を提供すると、次のようになります。
$ cat data
1 2 3 4 5 6 7 8 text still more text in this column 10
1 2 3 4 5 6 7 8 text2 still more text in this column 10
その後、上記のコマンドを実行できます。
$ awk -F'\t' -vOFS='\t' '{ $9="test=" $9 ";" }1' < data
1 2 3 4 5 6 7 8 test=text; still more text in this column 10
1 2 3 4 5 6 7 8 test=text2; still more text in this column 10
希望の出力を取得します。リダイレクトを使用してファイルに保存できます>
。
$ awk -F'\t' -vOFS='\t' '{ $9="test=" $9 ";" }1' < data > processed-data
答え2
GNUの使用sed
:
sed 's/[^\t]*/text=&;/9'
つまり、タブではなく9番目のシーケンスをtext=&;
(ここでは&
一致する部分を表す)に置き換えます。
他の実装を使用するシステムでは、sed
タブ文字を文字通り入力する必要があるかもしれません\t
。