将所有单词组合成一行,用分号分隔(AWK | SED)

时间:2014-04-29 00:45:57

标签: bash awk sed merge

大家好,需要一些帮助。作为文件的卷曲输出,我有以下内容:

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

8 个答案:

答案 0 :(得分:1)

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 inputfile

答案 1 :(得分:1)

使用gawk(GNU awk)或mawk

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

可悲的是,这不能与FreeBSD / OSX awk或严格的POSIX兼容版本一起使用,因为它们不支持多字符输入记录分隔符(RS

答案 2 :(得分:1)

这可能适合你(GNU sed):

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

一次读取3行并重新排列内容。

答案 3 :(得分:1)

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

答案 4 :(得分:0)

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); } }'

答案 5 :(得分: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

希望它有所帮助。

答案 6 :(得分:0)

这是一个简单的,可移植的awk版本:

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

答案 7 :(得分:0)

这是另一种变体。

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

但是,一些遗留sed实现会阻塞长输入行(ISTR旧BSD会在长度超过256个字符的行上发生段错误。)