scy*_*gon 1 large-files awk tail text-processing
我有一个 bash 命令管道,它产生大量的日志文本输出。但除了时间戳和一些次要标志外,大多数情况下它会重复上一行,主要输出数据在几个小时内仅更改一次。我需要将此输出存储为文本文件以供将来处理/研究。为了只打印每个 X 中的第一行,我应该将它传送到什么地方?
αғs*_*нιη 10
打印1条第一线,跳过下一个N-1行每N行的。
awk -v N=100 'NR%N==1' infile
Run Code Online (Sandbox Code Playgroud)
测试:
$ seq 1000 |awk -v N=100 'NR%N==1'
1
101
201
301
401
....
Run Code Online (Sandbox Code Playgroud)
要传递要跳过它们的行数,我们也可以从参数中读取,因此:
$ seq 1000 |awk -v Num=100 -v Skip=98 '(NR-1)%Num<Num-Skip'
1
2
101
102
201
202
301
302
401
402
501
502
601
602
701
702
801
802
901
902
Run Code Online (Sandbox Code Playgroud)
@??s??? 已经向您展示了如何执行您要求的操作(跳过特定数量的行),但听起来您最好不要打印仅在“时间戳和一些次要标志”方面不同的后续行,而不是找出特定数字要跳过的行数。如果是这样,如果这些“时间戳和一些次要标志”存储在字段 3、6、8 和 17 中,您将如何执行此操作:
awk '
{
origRec = $0
$3=$6=$8=$17=""
currKey = $0
}
currKey != prevKey {
print origRec
prevKey = currKey
}
' file
Run Code Online (Sandbox Code Playgroud)
您可以轻松调整上述内容,不仅打印每个相似组的第一行,还打印最后一行,以便您可以看到第一个和最后一个时间戳(如果有用),和/或您可以添加打印跳过了许多类似的行。