無制限の熱交換

無制限の熱交換

列を含むファイルがあります。以下の例をご覧ください。

a b c ... z  
1 2 3 ... 26

最初の列が最後の列になり、2番目の列が最後の列になるなど、すべての列を変更したいと思います。

z y x ... a  
26 25 24 ... 1

これを実行できるライナー(awkまたは)がありますか?列がほんの数個しかない場合はこれが機能することを知っていますが、何千もの列があるファイルに対してこれを実行できるようにしたいと思います。sed
awk

tacラインにぴったりですね。
熱と同等のものを探していると思います。

rev列の内容も変わるので私にはうまくいきません。

答え1

awk '{for(i=NF;i>0;i--)printf "%s ",$i;print ""}' file

答え2

小さなPythonスクリプトを使用してこれを行うことができます。

#!/usr/bin/env python

# Swaps order of columns in file, writes result to a file.
# usage: program.py input_file output_file

import sys, os

out = []

for line in open(sys.argv[1], 'r'):
    fields = line.split()
    rev = ' '.join(list(reversed(fields)))
    out.append(rev)

f = open(sys.argv[2], 'w')
f.write(os.linesep.join(out))

答え3

Pythonが気に入らない場合は、次の1行で各行のスペースで区切られた列の順序を逆に置き換えます。

paddy$ cat infile.txt 
a b c d e f g h i j k l
1 2 3 4 5 6 7 8 9 10 11 12
a e i o u
paddy$ python3 -c 'with open("infile.txt") as f: print("\n".join(" ".join(line.rstrip().split()[::-1]) for line in f))'
l k j i h g f e d c b a
12 11 10 9 8 7 6 5 4 3 2 1
u o i e a
paddy$ 

上記のコードはpython2.7でも動作します。

paddy$ python2.7 -c 'with open("infile.txt") as f: print("\n".join(" ".join(line.rstrip().split()[::-1]) for line in f))'
l k j i h g f e d c b a
12 11 10 9 8 7 6 5 4 3 2 1
u o i e a
paddy$ 

答え4

遅いですが、救いの恵みがあります。単一文字より広い場合は、フィールド区切り記号の幅を維持します。 FWIW:このスクリプトを2回実行すると、結果は元のものと同じです。

ここにスクリプトがあります。

awk '{ eix = length($0) 
       for( fn=NF; fn>0; fn--) { dix=eix
            while( substr($0,dix,1) ~ /[ \t]/ ) dix--
            printf "%s%s", substr($0,dix+1,eix-dix), $fn
            dix-=length($fn); eix=dix }
       print substr($0,1,dix)
    }' "$file"

以下はいくつかの時間比較です。テストファイルには1行が含まれています。

                      fields           fields     
                      10,0000          10,000,000

user11136 {python} | real  0.029s     real  3.235s
reversible? no     | user  0.032s     user  2.008s
                   | sys   0.000s     sys   1.228s

jmp {python}       | real  0.078s     real  5.045s
reversible? no     | user  0.068s     user  4.268s
                   | sys   0.012s     sys   0.560s

rush {awk}         | real  0.120s     real  10.889s
reversible? no     | user  0.116s     user   8.641s
                   | sys   0.008s     sys    2.252s

petero {awk}       | real  0.319s     real  35.750s
reversible? yes    | user  0.304s     user  33.090s
                   | sys   0.016s     sys    2.660s

関連情報