我有一个具有任意行数的文本文件,三元组如下:
4 5 2
12 16 6
现在我想向文件添加相关行。假设我想为每行添加 4 个具有相似值的额外行。前两列略有改变(其中一列为 -1 和 +1,所有四种组合均为 -1 和 +1),第三列的值减半:
4 5 2 (original row)
3 5 1 (added rows)
5 5 1
4 4 1
4 6 1
12 16 6 (original row)
11 16 3 (added rows)
13 16 3
12 15 3
12 17 3
行附加到哪里并不重要,所以如果添加的行全部位于文件末尾就可以了。
答案1
awk
:
#!/usr/bin/awk -f
BEGIN { OFS = "\t" }
{
print
print $1 - 1, $2, $3 / 2
print $1 + 1, $2, $3 / 2
print $1, $2 - 1, $3 / 2
print $1, $2 + 1, $3 / 2
}
当然,这有点取决于您需要如何格式化输出。上例假设输入记录以制表符分隔。
为了删除此后的重复项,请通过管道传输输出sort -n | uniq
。
首先不打印它们(因此保留原始顺序)的变体可以将看到的值存储在数组中并仅打印新的值:
#!/usr/bin/awk -f
function printnew(a, b, c) {
if(seen[a, b, c] != 1) {
seen[a, b, c] = 1
print a, b, c
}
}
BEGIN { OFS = "\t" }
{
printnew($1, $2, $3)
printnew($1 - 1, $2, $3 / 2)
printnew($1 + 1, $2, $3 / 2)
printnew($1, $2 - 1, $3 / 2)
printnew($1, $2 + 1, $3 / 2)
}