다음 텍스트가 있습니다.
Source IP,URL
1.1.1.1,example1.com
Blank,example2.com
2.2.2.2,example3.com
Blank,example4.com
Blank,example5.com
Blank,example6.com
Blank,example7.com
7.7.7.7,example8.com
Blank,example9.com
Blank,example10.com
"공백"을 위의 공백이 아닌 값으로 바꾸고 다음 출력을 얻으려면 어떻게 해야 합니까?
Source IP,URL
1.1.1.1,example1.com
1.1.1.1,example2.com
2.2.2.2,example3.com
2.2.2.2,example4.com
2.2.2.2,example5.com
2.2.2.2,example6.com
2.2.2.2,example7.com
7.7.7.7,example8.com
7.7.7.7,example9.com
7.7.7.7,example10.com
답변1
Perl 솔루션은 다음과 같습니다.
perl -pe ' $prev=$1 if /^([\d\.]+)/; s/Blank/$prev/' file.txt
설명하다:
Perl의
-p
플래그는 "입력 파일을 한 줄씩 살펴보고 각 줄을 인쇄한다"는 의미이며,-e
이는 "명령줄에 제공된 스크립트를 실행한다"는 의미입니다.$prev=$1 if /^([\d\.]+)/;
: 줄이 (^
) 숫자 문자열(\d
)과 점 으로 시작하면\.
해당 문자열(IP)이 로 저장됩니다$prev
. 따라서 스크립트가 파일을 읽을 때$prev
마지막으로 발견된 IP가 포함됩니다.s/Blank/$prev/
Blank
: 문자열을 로 대체할 값입니다$prev
.
답변2
awk -F, '{if ($1 == "Blank") ip=repltext; else {ip=$1; repltext=$1;};
print ip "," $2}' inputfile
"소스 IP, URL"이 입력의 일부가 아니라고 가정합니다. 으로 변경된 경우
awk -F, 'NR == 1 {next;}; {if ($1 == "Blank") ...
또한 첫 번째 데이터 행에는 "공백"이 포함되지 않고 항상 IP 주소가 포함되어 있다고 가정합니다.
답변3
관용적 awk 솔루션은 다음과 같습니다.
<infile awk '$1 == "Blank" { $1 = p } { p = $1 } 1' FS=, OFS=,
산출:
Source IP,URL
1.1.1.1,example1.com
1.1.1.1,example2.com
2.2.2.2,example3.com
2.2.2.2,example4.com
2.2.2.2,example5.com
2.2.2.2,example6.com
2.2.2.2,example7.com
7.7.7.7,example8.com
7.7.7.7,example9.com
7.7.7.7,example10.com