Bash列表识别中的第一个元素

时间:2014-06-12 18:43:56

标签: macos bash

我对Bash很新,所以如果这个问题非常简单,我很抱歉。我正在处理一个文本文件,其中包含许多数字2-32的垂直列表,按2计数,每个数字后面都有一行其他文本。问题是有些列表缺少数字。任何可以通过的代码指针,检查每个数字是否存在,如果没有添加一行并输入数字。

一个列表可能如下所示:

2      djhfbadsljfhdsalkfjads;lfkjs
4      dfhadslkfjhasdlkfjhdsalfkjsahf
6      dsa;fghds;lfhsdalfkjhds;fjdsklj
8      daflgkdsakfjhasdlkjhfasdjkhf
12     dlsagflakdjshgflksdhflksdahfl

一直到32岁。在这种情况下我怎么能这样做才能让10被识别为缺失然后被添加到12以上?谢谢!

2 个答案:

答案 0 :(得分:2)

这是一个基于awk的解决方案(为了便于阅读而格式化,不一定如何输入):

awk '    { value[0 + $1] = $2 }
     END { for (i = 2; i < 34; i+=2)
             print i, value[i]
         }' input.txt

它基本上只记录键/值对(关联数组)中的现有行,然后在最后打印您关注的所有记录,以及之前保存的(可能为空)值。

注意:如果需要将第一列视为字符串而不是整数,则此变体应该有效:

awk '    { value[$1] = $2 }
     END { for (i = 2; i < 34; i+=2)
             print i, value[i ""]
         }' input.txt

答案 1 :(得分:1)

您可以使用awk找出丢失的行并将其添加回来:

awk '$1==NR*2{i=NR*2+2} i < $1 { while (i<$1) {print i; i+=2} i+=2}
    END{for (; i<=32; i+=2) print i} 1' file

<强>测试

cat file
2      djhfbadsljfhdsalkfjads;lfkjs
4      dfhadslkfjhasdlkfjhdsalfkjsahf
6      dsa;fghds;lfhsdalfkjhds;fjdsklj
20     daflgkdsakfjhasdlkjhfasdjkhf
24     dlsagflakdjshgflksdhflksdahfl

awk '$1==NR*2{i=NR*2+2} i < $1 { while (i<$1) {print i; i+=2} i+=2}
    END{for (; i<=32; i+=2) print i} 1' file
2      djhfbadsljfhdsalkfjads;lfkjs
4      dfhadslkfjhasdlkfjhdsalfkjsahf
6      dsa;fghds;lfhsdalfkjhds;fjdsklj
8
10
12
14
16
18
20     daflgkdsakfjhasdlkjhfasdjkhf
22
24     dlsagflakdjshgflksdhflksdahfl
26
28
30
32