두 열의 내용 바꾸기

두 열의 내용 바꾸기

클리핑을 더 잘 이해하고 클리핑된 데이터를 다른 파일로 옮기려고 노력 중입니다. 두 개의 열이 있는 "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원본 데이터를 두 번 읽어야 합니다(모든 열을 되돌리려는 경우 일반적으로 열 수만큼 읽기).

관련 정보