簡體   English   中英

將所有單詞組合成用分號(AWK | SED)分隔的一行

[英]Combine all words into one line separated by semicolon (AWK|SED)

大家好,需要一些幫助。 作為輸出到文件的curl,我具有以下內容:

FINISHED
JOB#1
20140428 0016
FINISHED
JOB#2
20140428 0015

是否可以通過以下方式合並這些行:

JOB#1;0015;20140428;FINISHED
JOB#2;0016;20140428;FINISHED
JOB#3;0017;20140428;FINISHED

等等...

我試過了:

paste -d, -s filenew.com
BEGIN { finished=""; job=""; ff1=""; ff2=""; }
{
  if(finished == "") { finished = $0""; next; }
  if(job == "") { job = $0""; next; }
  if(ff1 == "") { ff1 = $2""; ff2 = $1""; printf("%s;%s;%s;%s\n", job,ff1,ff2,finished);
    finished="";job="";ff1="";ff2="";
  }
}
END { }

awk -f formatter.awk輸入文件

使用gawk (GNU awk)或mawk

awk -v RS='FINISHED' -v OFS=';' '$0 { print $1, $3, $2, RS }' file

遺憾的是,這不適用於FreeBSD / OSX awk或嚴格符合POSIX的版本,因為它們不支持多字符輸入記錄分隔符( RS )。

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

sed -r 'N;N;s/(.*)\n(.*)\n(.*) (.*)/\2;\3;\4;\1/' file

一次讀取3行,然后重新排列內容。

posix awk支持getline這樣:

$ awk --posix -v OFS=';' '
    {Status = $0; getline Job; getline; Date = $1; Time = $2;
    print Job, Time, Date, Status;}' file.txt
JOB#1;0016;20140428;FINISHED
JOB#2;0015;20140428;FINISHED
awk '/^FINISHED/ && job { printf("%s;%s;%s;%s\n", job, num, date, $0); job = "" }
     /^JOB/ { job = $0 }
     /^[0-9]+ [0-9]+$/ { num = $2; date = $1; }
     END { if (job) { printf("%s;%s;%s;%s\n", job, num, date, $0); } }'

Serg12,我假設您有錯字,並且您的意思是輸出應為:

JOB#1;0016;20140428;FINISHED
JOB#2;0015;20140428;FINISHED

即第一行的0016和第二行的0015。 使用sed,您還可以執行以下操作:

sed -n "/FINISHED/ n;h;N;s/\(.*\)\n\(.*\) \(.*\)/\1;\3;\2;FINISHED/p" file

希望能幫助到你。

這是一個簡單的可移植awk版本:

awk '/^2014/ {print x,$2,$1,y} {y=x;x=$0}' OFS=";" file
JOB#1;0016;20140428;FINISHED
JOB#2;0015;20140428;FINISHED

這是另一種變化。

tr \n' ';' <file | sed 's/\(;FINISHED\);/\1\n/g'

但是,某些舊版sed實現會在較長的輸入行上阻塞(ISTR舊的BSD在長度超過256個字符的行上已經存在段錯誤)。

暫無
暫無

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

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