簡體   English   中英

是否可以使用 Linux 命令或 shell 腳本根據特定條件刪除文件中不需要的行?

[英]Is it possible using a Linux command or shell script to remove unwanted rows in a file based on certain condition?

我有一個包含~12300000<timestamp, reading>類型的文件 -

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 腳本來完成嗎? 如果是這樣怎么辦? 謝謝。

如果我理解正確的話,您正在嘗試創建文件,這些文件從最后一個文件開始,每個文件的行數相同且相等。

如果是這樣,該腳本將執行該任務。

如果您只想要一個文件,那么您可以刪除與循環和索引值迭代相關的邏輯。

注意:每個文件的名稱對應於每個文件中最后一行的第一部分(即記錄的最后一個條目)。

此示例對 5 行的分組進行拆分。 您可以根據需要將 5 替換為 100 或 200。

#!/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}"
    

如果您只想要日志的最后 200 行條目,那么最簡單的方法就是使用tail

tail -200 log.txt >${newLogName}

如果你想創建多個文件,每個文件 200 行,你可以使用序列

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

在一個循環中,包括為每個切片 ${newLogName} 切片分配一個唯一的名稱。

或者,您可以在一開始就創建一個反向日志,並創建沿着反向列表工作的子列表,但請記住在將它們保存為最終形式之前先反向每個候選列表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM