클리핑을 더 잘 이해하고 클리핑된 데이터를 다른 파일로 옮기려고 노력 중입니다. 두 개의 열이 있는 "Numbers"라는 파일이 있습니다. 각 열은 탭으로 구분됩니다.
명령을 사용하여 cut
열을 교환 하고 cut
명령 출력을 다른 파일에 저장하려고 합니다. 문제 없이 필드 2를 잘라서 출력을 copynumber
파일에 저장할 수 있습니다. 하지만 cut
출력 파일에서 필드 1 필드를 필드 2로 변환하는 방법을 모르겠습니다 .
bash 쉘 스크립트만 사용하고 awk
.
#I have tried the following commands:
$cat numbers
1 2
10 20
100 200
1000 2000
10000 20000
100000 300000
1000000 3000000
cat numbers | cut -f 2 > copynumbers
#How do I get field 1 from the original file into field 2 of the output file?
$cat copynumbers
2
20
200
2000
20000
300000
3000000
답변1
Perl에 익숙하다면 다음 유틸리티 모음 중 하나가 유용할 수 있습니다. 여기서 TSV 입력은 z5 파일에 있습니다.
$ recut 2,1 z5
2 1
20 10
200 100
2000 1000
20000 10000
300000 100000
3000000 1000000
재절단에 관한 일부 정보누락된 Textutils모으다:
recut Process fields like cut, allow repetitions and re-ordering. (what)
Path : ~/bin/recut
Version : - ( local: RepRev 1.1, ~/bin/recut, 2010-06-10 )
Length : 56 lines
Type : Perl script, ASCII text executable
Shebang : #!/usr/bin/perl
Home : http://www1.cuni.cz/~obo/textutils/ (doc)
Modules : (for perl codes)
Getopt::Long 2.42
저희 매장의 공통 tac은 다음과 같은 상황을 처리합니다.
$ my-tac --field=0 z5
2 1
20 10
200 100
2000 1000
20000 10000
300000 100000
3000000 1000000
지금까지 라이브러리를 출시하지 않았지만 다시 만들고 싶다면 다음 방법을 따르세요.
my-tac - reverse any one property: lines (like tac), fields, characters.
The default is to reverse the lines in a file, so a file like:
a
b
c
will be printed as:
c
b
a
usage: my-tac [options] -- [files]
options:
--help (or -h)
print this message and quit.
--character
Reverse order of characters in each line. That is, given:
abc
the result is:
cba
--field=0
Reverse order of fields. That is, given:
Now is the time
the result is:
time the is Now
--field=i,j,k
Reverse content of specific fields i,j,k. That is given
Now is the time
my-tac --field=1,3 wil result in:
woN is eht time
--para
Reverse order of paragraphs, which are groups of lines
separated by one of more empty lines. If the last paragraph is
not followed by an enpty line, one is supplied.
--number=n
Print only n lines for a file reversal. <no limit>.
--debug
Print internal debugging information. <off>.
(Must be first option.)
--separator=",re,string"
Set the input separator to regular expression re, <\s+>, and
the output separator to string, < >. So the default is
",\s+, ". Any character may be used in place of the comma, so
you could specify:
--separator=';\s+;|'
행운을 빕니다... 건배, drl
답변2
사용프로세스 교체그리고 paste
:
$ paste <(cut -f2 numbers) <(cut -f1 numbers)
2 1
20 10
200 100
2000 1000
20000 10000
300000 100000
3000000 1000000
답변3
내 생각에는 awk
이 작업을 해결하는 데 사용되는 방법은 일반적으로 "셸 스크립트"로 간주되는 범주에 속합니다.
awk -F '\t' 'BEGIN { OFS=FS } { print $2, $1 }'
먼저 블록을 사용하여 입력 구분 기호를 tab 으로 설정한 -F '\t'
다음 이 BEGIN
블록은 출력 구분 기호를 동일한 문자로 설정합니다. 유일한 블록의 본문은 단순히 두 필드를 역순으로 출력합니다.
시험:
$ awk -F '\t' 'BEGIN { OFS=FS } { print $2, $1 }' numbers
2 1
20 10
200 100
2000 1000
20000 10000
300000 100000
3000000 1000000
모든 열을 뒤집는 보다 일반적인 방법(수에 관계없이):
BEGIN { OFS=FS }
{
for (i = 1; i <= NF/2; ++i ) {
t=$i; $i=$(NF-i+1); $(NF-i+1)=t
}
print
}
이렇게 하면 행의 처음부터 중간까지 열을 반복하여 각 열을 끝의 해당 열로 교체합니다. 홀수 열이 포함된 입력 데이터의 경우 중간 열은 변경되지 않습니다.
열 중 하나를 사용하여 임시 파일을 생성하는 초기 접근 방식을 사용하는 것도 가능합니다.
cut -f 2 numbers >tmpfile
원본 파일을 이 파일에 붙여넣으면 세 개의 열(다시 열 2, 1, 2)이 있는 데이터 세트가 생성됩니다.
paste tmpfile numbers
그런 다음 다음을 사용하여 마지막 열을 삭제할 수 있습니다 cut
.
paste tmpfile numbers | cut -f 1,2
또는 임시 파일 없이 시작할 수도 있습니다.
cut -f 2 numbers | paste - numbers | cut -f 1,2
사용되는 모든 솔루션은 cut
원본 데이터를 두 번 읽어야 합니다(모든 열을 되돌리려는 경우 일반적으로 열 수만큼 읽기).