将某些字符串替换为前一行中的值

将某些字符串替换为前一行中的值

我有以下文字:

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

相关内容