我有以下文字:
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