linux - 补充模式

标签 linux bash shell awk

我在文件中有这些类型的记录:

1867    121 2 56 
1868    121 1 6 
1868    121 2 65 
1868    122 0 53 
1869    121 0 41 
1869    121 1 41 
1871    121 1 13 
1871    121 2 194

我想得到这个输出:

1867    121 2 56 
1868    121 1 6 
1868    121 2 65 
1868    122 0 53 
1869    121 0 41 
1869    121 1 41 
1870    121 0 0
1871    121 1 13 
1871    121 2 194

区别在于 1870 121 0 0 行。

因此,如果第一列中的数字之间的差异大于 1,那么我们必须包含一个包含缺失数字的行(上面的例子是 1870)和其他列.应该以某种方式获取其他列,让第二列成为列数可能值的最小值(在示例中,这些值可能是 121122),并且与第三列的情况相同。最后一列的值始终为零。

有人可以给我一些建议吗?提前致谢!

我正在尝试用 awk 解决它,但也许有其他更好或更实用的解决方案...

最佳答案

像这样的东西可以工作-

awk 'BEGIN{getline;a=$1;b=$2;c=$3}
NR==FNR{if (b>$2) b=$2; if (c>$3) c=$3;next} 
{if ($1-a>1) {x=($1-a); for (i=1;i<x;i++) {print (a+1)"\t"b,c,"0";a++};a=$1} else a=$1;print}' file file

说明:

  1. BEGIN{getline;a=$1;b=$2;c=$3} -

    在这个 BEGIN block 我们读取第一行并在 column 1 中赋值到变量 a , column 2到变量 bcolumn 3到变量 c .

  2. NR==FNR{if (b>$2) b=$2; if (c>$3) c=$3;next} -

    在此我们扫描整个文件 ( NR==FNR ) 并跟踪 column 2 中可能的最低值和 column 3并将它们存储在变量中 bc分别。我们使用 next避免运行第二个 pattern{action}陈述。

  3. {if ($1-a>1) {x=($1-a); for (i=1;i<x;i++) {print (a+1)"\t"b,c,"0";a++};a=$1} else a=$1;print} -

    action语句检查 column 1 中的值并将其与 a 进行比较.如果差异大于 1,我们执行 for loop添加所有缺失的行并设置 a 的值至 $1 .如果 column 1 中的值在连续的行上不大于 1,我们分配值 column 1aprint它。

测试:

[jaypal:~/Temp] cat file
1867    121 2 56 
1868    121 1 6 
1868    121 2 65 
1868    122 0 53 
1869    121 0 41 
1869    121 1 41 
1871    121 1 13  # <--- 1870 skipped
1871    121 2 194
1875    120 1 12 # <--- 1872, 1873, 1874 skipped

[jaypal:~/Temp] awk 'BEGIN{getline;a=$1;b=$2;c=$3}
NR==FNR{if (b>$2) b=$2; if (c>$3) c=$3;next} 
{if ($1-a>1) {x=($1-a); for (i=1;i<x;i++) {print (a+1)"\t"b,c,"0";a++};a=$1} else a=$1;print}' file file
1867    121 2 56 
1868    121 1 6 
1868    121 2 65 
1868    122 0 53 
1869    121 0 41 
1869    121 1 41 
1870    120 0 0 # Assigned minimum value in col 2 (120) and col 3 (0).
1871    121 1 13 
1871    121 2 194
1872    120 0 0 # Assigned minimum value in col 2 (120) and col 3 (0).
1873    120 0 0 # Assigned minimum value in col 2 (120) and col 3 (0).
1874    120 0 0 # Assigned minimum value in col 2 (120) and col 3 (0).
1875    120 1 12

关于linux - 补充模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8736039/

相关文章:

java - 在 Java 中与命令行工具通信

linux - 这两个命令之间的区别(w & w/out "")以及为什么?

linux - Linux 中的远程 Shell

xml - Bash,删除空的 XML 标签

bash - 是否可以设置 cron 作业或 bash 脚本从现在开始运行 X 分钟?

linux - 使用 shell 脚本 ssh 到不同的节点

linux - 如何设置系统范围的umask?

linux - Unix的时间计算软件

java - 如何创建和配置 Hadoop 客户端脚本?

linux - 如何在命令行中将 markdown 转换为 pdf