>

입력 파일은 다음과 같습니다 :

1 0 0 000 3444
2 3 3 456 6875
3 0 0 023 3300
4 2 2 211 1000

먼저 : 각 줄의 사본 2 개를 갖고 싶습니다 :

1 0 0 000 3444
1 0 0 000 3444
2 3 3 456 6875
2 3 3 456 6875
3 0 0 023 3300
3 0 0 023 3300
4 2 2 211 1000
4 2 2 211 1000

두 번째 : 각 줄의 첫 번째 사본에서 3은 2로 대체되어야하고 4는 1로 대체되어야하고 각 줄의 두 번째 사본에서는 3은 1로 대체되어야하고 4는 2로 대체되어야합니다 (첫 번째 열 행 이름과 행 번호는 변경하지 않아야합니다). 따라서 최종 출력은 다음과 같습니다.

1 0 0 000 2111
1 0 0 000 1222
2 2 2 156 6875
2 1 1 256 6875
3 0 0 022 2200
3 0 0 021 1100
4 2 2 211 1000
4 2 2 211 1000

제안이 있으십니까? 시도했지만 작동하지 않습니다.

awk '
      { tmp = $2; gsub("3", "2", $2); gsub("4", "1", $2); print}
      { $2 = tmp; gsub("3", "1", $2); gsub("4", "2", $2); print}
    ' < input > output


  • 답변 # 1

    각 줄을 두 배로 늘리는 방법 : 여기를 참조하십시오 ...
    두 번째 요청과 관련하여 첫 번째 필드와 전체 행을 변수에 저장 한 다음 첫 번째 변경을 수행하고 첫 번째 필드를 초기 값으로 설정하고 인쇄 한 다음 줄 내용을 복원하고 두 번째 변경을 수행하고 첫 번째 필드를 다시 설정하십시오 초기 값 및 인쇄 :

    awk '{t=$1;l=$0;gsub(/3/, "2");gsub(/4/, "1");$1=t;print}
    {$0=l;gsub(/3/, "1");gsub(/4/, "2");$1=t;print}' infile
    
    

  • 답변 # 2

    펄은 tr 가 내장되어 있기 때문에 이런 종류의 것에는 아주 좋은 것 같습니다

    $ perl -alne '
        @tmp=@F; 
        tr/34/21/ for @tmp[1..4]; print join " ", @tmp; 
        tr/34/12/ for @F[1..4]; print join " ", @F
      ' file
    1 0 0 000 2111
    1 0 0 000 1222
    2 2 2 156 6875
    2 1 1 256 6875
    3 0 0 022 2200
    3 0 0 021 1100
    4 2 2 211 1000
    4 2 2 211 1000
    
    

  • 답변 # 3

    정말 우아하지는 않지만 GNU sed 에서 가능합니다 :

    h              # save in hold
    s_^[0-9]\{1,\} __ # remove first column
    s_3_A_g        # change 3 and 4 to A and B
    s_4_B_g
    x              # swap with hold
    s_ .*$__       # remove everything but first column
    G              # append from hold
    s_\n_ _        # join lines (with space)
    h              # save in hold space again
    s_A_2_g        # first output -> 2, 1
    s_B_1_g
    p              # print first line
    g              # restore from hold 
    s_A_1_g        # second output -> 1, 2
    s_B_2_g
    # end of script, second line printed automatically
    
    

    이것은 첫 번째 열을 저장하고 (변경되지 않음) 나머지 3과 4가 각각 As와 B로 변경된 라인의 버전을 만듭니다. 그런 다음이 라인은 두 출력 모두에 사용되며 먼저 2 를 사용합니다.  그리고 1 그런 다음 다른 방향으로 돌아갑니다.

    sed -f script.sed input > output
    
    

    이것은 입력에 숫자와 공백 만 포함한다고 가정합니다. 와이즈 비즈  그리고 A  아직 나타나지 않습니다.

    B

  • 이전 sed - 여러 문자열이 포함 된 줄 끝에 텍스트를 추가하려면 어떻게합니까?
  • 다음 grep - UNIX 파일의 출력 형식화