我想使用awk / python比较大文件(~1GB)中的连续行(因为我使用大文件,我更喜欢使用awk)命令。以下是输入和输出的示例:
输入文件
#x y
1 11 # Remarks (not part of the input file)
10 12 # (Remark *1)
10 17 #
4 14
20 15 # (Remark *2)
20 16 #
20 17 #
20 22 #
5 19
10 20
(备注* 1):由于该行的x值和连续行/行的x值相同,因此应在输出文件中打印该行或下一行(RANDOM选择)
(备注* 2):由于此行的x值和后3行的x值相同,因此应在输出文件中打印此行或接下来的3行中的一行(RANDOM选择)
我想要的输出文件是这样的:
#x y
1 11
10 17
4 14
20 17
5 19
10 20
或(因为随机选择,如果相同的x值出现在连续的行中)
#x y
1 11
10 12
4 14
20 16
5 19
10 20
基本上我想比较当前行/行的x值是否与下一个连续行/行的x值相同。 如果不是,则应打印当前行。 如果是,则只应选择具有相同x值的连续行/行的一个随机行(y值对于比较不重要)。
我希望,有人可以帮助我!
答案 0 :(得分:2)
$ cat tst.awk
function prtBuf( idx) {
if (cnt > 0) {
idx = int((rand() * cnt) + 1)
print buf[idx]
}
cnt = 0
}
BEGIN { srand() }
$1 != prev { prtBuf() }
{ buf[++cnt]=$0; prev=$1 }
END { prtBuf() }
$ awk -f tst.awk file
1 11 # Remarks (not part of the input file)
10 17 #
4 14
20 17 #
5 19
10 20
$ awk -f tst.awk file
1 11 # Remarks (not part of the input file)
10 12 # (Remark *1)
4 14
20 22 #
5 19
10 20
我认为您示例中的x
和y
列标题实际上并不是您输入文件的一部分,因此将其删除。如果它们确实存在并且您希望它们在输出中,那么只需在前面添加NR==1{print;next}
行。