열이 포함된 파일이 있습니다. 아래 예를 참조하세요.
a b c ... z
1 2 3 ... 26
첫 번째 열이 마지막 열이 되고, 두 번째 열이 마지막 열이 되는 등의 모든 열을 바꾸고 싶습니다.
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이 마음에 들지 않으면 다음 한 줄로 각 행에서 공백으로 구분된 열의 순서를 반대로 바꿉니다.
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: 이 스크립트를 두 번 실행하면 결과는 원본과 동일합니다.
여기에 스크립트가 있습니다.
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