我对Bash很新,所以如果这个问题非常简单,我很抱歉。我正在处理一个文本文件,其中包含许多数字2-32的垂直列表,按2计数,每个数字后面都有一行其他文本。问题是有些列表缺少数字。任何可以通过的代码指针,检查每个数字是否存在,如果没有添加一行并输入数字。
一个列表可能如下所示:
2 djhfbadsljfhdsalkfjads;lfkjs
4 dfhadslkfjhasdlkfjhdsalfkjsahf
6 dsa;fghds;lfhsdalfkjhds;fjdsklj
8 daflgkdsakfjhasdlkjhfasdjkhf
12 dlsagflakdjshgflksdhflksdahfl
一直到32岁。在这种情况下我怎么能这样做才能让10被识别为缺失然后被添加到12以上?谢谢!
答案 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