![AWK를 사용하여 행을 검색하고 다른 행의 특정 값으로 바꿉니다.](https://linux55.com/image/214718/AWK%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%ED%96%89%EC%9D%84%20%EA%B2%80%EC%83%89%ED%95%98%EA%B3%A0%20%EB%8B%A4%EB%A5%B8%20%ED%96%89%EC%9D%98%20%ED%8A%B9%EC%A0%95%20%EA%B0%92%EC%9C%BC%EB%A1%9C%20%EB%B0%94%EA%BF%89%EB%8B%88%EB%8B%A4..png)
첫 번째 행의 "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 -n
awk
-l
join()
awk를 사용하여 비슷한 작업을 수행할 수 있지만 아마도 (perl에 내장된) 함수를 작성해야 할 것입니다 .