1

22 列と最大 10^6 行を含む大きなタブ区切りの txt ファイルがあります。ファイルの列 7 は、次のように編集する必要がある 11 文字の文字列です: 最後の 5 文字 (chr 7-11) は最初の 5 文字である必要があります。

たとえば、現在のファイルは次のようになります。

col1a col2a col3a col4a col5a col6a XXXXXXAAAAA col8a ...
col1b col2b col3b col4b col5b col6b XXXXXXBBBBB col8b ...
col1c col2c col3c col4c col5c col6c XXXXXXCCCCC col8c ...
col1d col2d col3d col4d col5d col6d XXXXXXDDDDD col8d ...
....

望ましい出力は次のとおりです。

col1a col2a col3a col4a col5a col6a AAAAAXXXXXX col8a ...
col1b col2b col3b col4b col5b col6b BBBBBXXXXXX col8b ...
col1c col2c col3c col4c col5c col6c CCCCCXXXXXX col8c ...
col1d col2d col3d col4d col5d col6d DDDDDXXXXXX col8d ...
....

これを行う1つの方法は、関連する列を を使用して2つに切り取り、おそらく?cutを使用して再度結合することです。pasteこれまでのところ、これを複数の手順で行うことしかできませんでした (元のファイル名は短いです)。

1)awkとを使用しcutて、列の半分ごとに 1 つずつ、2 つの新しいファイルを作成します。

awk ' BEGIN { FS="\t"; OFS="\t" } {print $7} ' short | cut -c1-6 > file1
awk ' BEGIN { FS="\t"; OFS="\t" } {print $7} ' short | cut -c7-11 > file2

2) を使用pasteしてそれらを貼り付けます

paste -d "" file2 file1 > file12

3)paste新しいファイルを元のファイルに貼り付けるために使用

paste -d"\t" short file12 > shortCom

4) 'awk' を使用して、元の列 7 を新しい列に置き換えます。

awk ' BEGIN { FS="\t"; OFS="\t" } {
$7 = $23
print $0 } ' shortCom

これは明らかに非常に長くて面倒なプロセスであり、実際には非常に単純であると思われます...これをより迅速かつ効率的にするために、これを改善するためのアドバイスをいただければ幸いです。

ありがとう!!

4

1 に答える 1

1

これはうまくいくはずです:

awk '{y=substr($7,1,5);z=substr($7,6); $7=z""y;}1' inputfile

あなたが持っているgnu awk場合:

gawk '{$7=gensub(/(.{5})(.{6})/ , "\\2\\1" , "g" , $7)}1' inputfile
于 2013-05-29T16:30:39.743 に答える