AWK를 사용하여 행을 검색하고 다른 행의 특정 값으로 바꿉니다.

AWK를 사용하여 행을 검색하고 다른 행의 특정 값으로 바꿉니다.

첫 번째 행의 "1"을 두 번째 행에 지정된 값으로 바꾸고 싶습니다. 입력 데이터 세트는 다음과 같습니다.

0,0,1,1,0,0,1,1,0,1,0,1,0,1
65,70,75,80,85,85,90

원하는 출력:

0,0,65,70,0,0,75,80,0,85,0,85,0,90

미리 감사드립니다.

답변1

다음과 같습니다(모든 것 awk):

$ tac file | awk '
    BEGIN{FS=OFS=","}
    NR==1{split($0, a, FS);next}
    NR==2{for (i=1; i<=NF; i++)
        if ($i == 1) $i=a[++c]}
    1 # aka print
' 

다음 tac file으로 교체tail -r file*BSD

산출

0,0,65,70,0,0,75,80,0,85,0,85,0,90

답변2

GNU 사용sed

$ sed -Ez ':a;s/([^,]*)1\>(,?[^\n]*\n)([0-9]+)(,|\n)/\1\3\2/;ta' input_file
0,0,65,70,0,0,75,80,0,85,0,85,0,90

답변3

tac@GillesQuenot의 답변이 마음에 들지만 or 가 필요하지 않은 perl을 사용하는 대안이 있습니다 tail -r.

대신 세 개의 배열을 사용합니다. 하나는 첫 번째 입력 행( @l)에, 하나는 두 번째 행( @a)에, 세 번째는 출력( )에 사용됩니다 @o). END 블록에 인쇄됩니다.

$ perl -F, -le '
    if ($.==1) { @l = @F };
    if ($.==2) { @a = @F };
    END {
      foreach $i (0..$#l) {
        push @o, $l[$i] == 1 ? $a[$c++] : $l[$i]
      };
      print join("," , @o)
    }' input.txt
0,0,65,70,0,0,75,80,0,85,0,85,0,90

그건 그렇고, Perl의 -F옵션은 Perl의 -a(@F라는 배열로 자동 분할) 및 ( 또는 -n같은 입력 반복 ) 옵션을 자동으로 활성화합니다. 줄바꿈 문자 등의 줄 끝 문자 자동 처리를 활성화합니다.sed -nawk-l

join()awk를 사용하여 비슷한 작업을 수행할 수 있지만 아마도 (perl에 내장된) 함수를 작성해야 할 것입니다 .

관련 정보