ubuntu 是否可以根据特定条件使用Linux命令或shell脚本删除文件中不需要的行?

2nbm6dog  于 2023-01-29  发布在  Linux
关注(0)|答案(2)|浏览(205)

我有一个<timestamp, reading>类型的~12300000行文件-

1674587549.228 29214
1674587549.226 29384
1674587549.226 27813
1674587549.226 28403
1674587549.228 28445
...
1674587948.998 121
1674587948.998 126
1674587948.999 119
1674587949.000 126
1674587948.996 156
1674587948.997 152
1674587948.998 156
1674588149.225 316
1674588149.226 310
1674588149.223 150
1674588149.224 152
1674588149.225 150
1674588149.225 144
...
1674588149.225 227
1674588149.226 233
1674588149.226 275

last - first时间戳等于600。我想创建一个新文件,从last - nth时间戳行开始,直到结束。
例如,如果为n=200,则新文件应以1674588149.226-200开头,即从1674587949.000 1261674588149.226 275
这可以用linux命令/ shell脚本来完成吗?如果可以,怎么做?谢谢。

ljo96ir5

ljo96ir51#

如果我没理解错的话,您试图创建的文件从最后一行开始,每个文件中的行数都是恒定的。
如果是,此脚本将执行该任务。
如果只需要一个文件,则可以删除与循环和索引值迭代关联的逻辑。
注:每个文件的名称对应于每个文件中最后一行的第一部分(即记录的最后一个条目)。
这个例子对5行的分组进行拆分。你可以用100或200来替换5行。

#!/bin/bash

input="testdata.txt"
cat >"${input}" <<"EnDoFiNpUt"
1674587948.998 121
1674587948.998 126
1674587948.999 119
1674587948.996 156
1674587948.997 152
1674587948.998 156
1674587949.000 126
1674588149.225 316
1674588149.226 310
1674588149.223 150
1674588149.224 152
1674588149.225 150
1674588149.225 144
1674588149.225 227
1674588149.226 233
1674588149.226 275
EnDoFiNpUt

awk -v slice="5" 'BEGIN{
    split("", data) ;
    dataIDX=0 ;
}
{
    dataIDX++ ;
    data[dataIDX]=$0 ;
}
END{
    #print dataIDX ;

    slLAST=dataIDX ;
    #print slLAST ;

    slFIRST=slLAST-slice+1 ;
    if( slFIRST <= 0 ){
        slFIRST=1 ;
    } ;
    #print slFIRST ;

    k=0 ;
    while( slLAST > 0 ){
        k++;
        split(data[slLAST], datline, " " ) ;
        fname=sprintf("%s__%03d.txt", datline[1], k ) ;
        printf("\t New file: %s\n", fname ) | "cat >&2" ; 

        for( i=slFIRST ; i<=slLAST ; i++){
            print data[i] >fname ;
        } ;

        if( slFIRST == 1 ){
            exit ;
        } ;

        slLAST=slFIRST-1 ;
        slFIRST=slLAST-slice+1 ;
        if( slFIRST <= 0 ){
            slFIRST=1 ;
        } ;
    } ;
}' "${input}"
wwtsj6pe

wwtsj6pe2#

如果你只想要一个日志的最后200行条目,那么最简单的方法就是使用tail

tail -200 log.txt >${newLogName}

如果要创建多个文件,每个文件包含200行,则可以使用以下序列

tac log.txt | tail -n +201 | tac >log.remain
mv log.remain log.txt

在包括为每个切片${newLogName}切片分配唯一名称循环中。
或者,您可以在开始时创建一个反向日志,然后沿着反向列表向下创建子列表,但要记住在以最终形式保存这些列表之前反向每个候选列表。

相关问题