첫 번째 행의 "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에 내장된) 함수를 작성해야 할 것입니다 .