簡體   English   中英

如何合並文件中的每n行

[英]How to merge every n lines in a file

我正在嘗試將類似的線組合並為一行。 我的文件是一個基本的日志類型文件,但是每個條目跨越三行,后跟一個換行符。 例:

Timestamp
key1 | val1 | key2 | val2
key3 | val3 | key4 | val4

Timestamp
key1 | val1 | key2 | val2
key3 | val3 | key4 | val4

我想要的是,每行3行位於一個逗號分隔的行中:

Timestamp,key1,val1,key2,val2,key3,val3,key4,val4

如果我只需要處理鍵/值行,我可以用sed&awk做到這一點,但是我的問題是獲取每行的時間戳。

我看過的事情是使用xargs粘貼,但似乎都沒有做到我需要他們做的事情。

$ awk -v RS= -F'\n| \\| ' -v OFS=',' '{$1=$1}1' file
Timestamp,key1,val1,key2,val2,key3,val3,key4,val4
Timestamp,key1,val1,key2,val2,key3,val3,key4,val4

sedpaste替代解決方案

$ sed 's/ *| */,/g;/^$/d' file | paste -d, - - -

Timestamp,key1,val1,key2,val2,key3,val3,key4,val4
Timestamp,key1,val1,key2,val2,key3,val3,key4,val4

內容如下:用逗號替換定界符,刪除空行,一次用逗號分隔符粘貼3行。

這可能對您有用(GNU sed):

sed -n 'N;N;s/ *[|\n] */,/pg;n' file

將3行讀入模式空間,用逗號替換豎線或換行符(可能被空格包圍),打印成功的替換並丟棄空行。

該awk利用內置的RS變量來簡化記錄之間的移動。 我們檢測是否在時間戳行上,如果存在則設置ts變量。 然后,由於我們將RS $1設置$1 $NF將是我們的鍵,值字段,因此對其進行迭代並將其附加到輸出字符串中。 我們將最后一個保存在循環外,這樣可以避免晃動, 然后,我們僅打印該行並繼續。

BEGIN{
    RS="\n\n";  # Everything between blank lines will be treated as one record
    FS="|";     # Our fields are separated with pipes.
}
{ 
    if( NF == 1 ){   # The number of fields on this line is 1... only our timestamp lines look like this.
        ts=$1;      
        next;       # Go to next record.
    };  



    # Build up an output buffer while avoiding dangling ","   
    out="";          

    for( i=1; i < NF; i++ ){
        out=out$i","
    } 

    out=out$NF; 

    print ts","out 
}

嘗試:

awk '/^Timestamp/ && VAL{print VAL;VAL=$0;next} {gsub(/ +\| +/,",");VAL=VAL?VAL OFS $0:$0} END{print VAL}' OFS=","   Input_file

如果它們都具有值,則查找字符串Timestamp和VAL,然后打印變量VAL的值,然后將VAL分配給當前行,並提及下一行以跳過所有其他語句。 然后,如果不滿足此條件,則全局替換空間| 用逗號隔開,然后創建一個名為VAL的變量,其值將每次與自己的值相連接。 然后在END部分中也打印VAL的值,因為在那里可能存在VAL。

一些僅用於sed的愚蠢技巧:

sed -n -e '/Timestamp/{h;n};s/ | /,/g;H;/^$/{g;s/\\n/,/g;s/,$//;p}' file

  • 僅在使用p命令時使用sed -n進行打印
  • /Timestamp/{h;n}; 替換時間戳記行的保留空間,然后移至輸入的下一行
  • s/ | /,/g;H; 用逗號替換小節並追加到保留空間
  • /^$/{g;s/\\n/,/g;s/,$//;p}對空白行得到保留空間的內容到圖案空間, s/\\n/,/g取代換行符用逗號,最后s/,$//;p刪除結尾的逗號並打印模式空間

輸入file

Timestampa
key1 | val1 | key2 | val2
key3 | val3 | key4 | val4

Timestampb
key1 | val1 | key2 | val2
key3 | val3 | key4 | val4

輸出:

Timestampa,key1,val1,key2,val2,key3,val3,key4,val4
Timestampb,key1,val1,key2,val2,key3,val3,key4,val4

s/\\n/,/g可能取決於系統/ sed版本。

暫無
暫無

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

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