[英]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做到這一點,但是我的問題是獲取每行的時間戳。
$ 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
sed
和paste
替代解決方案
$ 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.