如何将每隔一行的最后一列追加到下一行的最后一列

时间:2019-04-19 06:43:44

标签: awk

我想在每隔一行(奇数行)的后面加上最后一行(偶数行)的最后一列。我尝试了几种不同的命令,但是似乎没有一个命令可以完成我要实现的任务。

原始数据:

user|396012_232|program|30720Mn|
|396012_232.batch|batch|30720Mn|5108656K
user|398498_2|program|102400Mn|
|398498_2.batch|batch|102400Mn|36426336K
user|391983_233|program|30720Mn|
|391983_233.batch|batch|30720Mn|5050424K

我想获取“批处理”行中的最后一个字段,并将其上方的行附加到“批处理”行中的最后一个字段。

所需的输出:

user|396012_232|program|30720Mn|5108656K
|396012_232.batch|batch|30720Mn|5108656K
user|398498_2|program|102400Mn|36426336K
|398498_2.batch|batch|102400Mn|36426336K
user|391983_233|program|30720Mn|5050424K
|391983_233.batch|batch|30720Mn|5050424K

然后将“ batch”行从输出中删除,因此在这些行中,如果以任何方式剪切,复制或更改该行,则没有任何偏好。

在我陷入困境的地方,我试图完成逻辑的尝试令人尴尬地不合逻辑:

awk 'BEGIN{OFS="|"} {FS="|"} {if ($3=="batch") {a=$5} else {} ' file.data

谢谢!

2 个答案:

答案 0 :(得分:2)

如果您不需要在字段3中将行保留为batch,则可以使用

awk 'BEGIN{OFS=FS="|"} NR%2==1 { prev=$0 }; $3=="batch" { print prev $5 }' file.data

awk 'BEGIN{OFS=FS="|"} NR%2==1 { prev=$0 }; NR%2==0 { print prev $5 }' file.data

请参见online awk demoanother demo

详细信息

  • BEGIN{OFS=FS="|"}-将字段分隔符设置为管道
  • NR%2==1 { prev=$0 };-将奇数行保存在prev变量中
  • $3=="batch"-检查字段3是否等于batch(可能使用此逻辑,您可以将其替换为NR%2==0以得到偶数行)
  • { print prev $5 }-打印上一行和字段5。

您也可以考虑使用sed选项:

sed 'N;s/\x0A.*|\([^|]*\)$/\1/' file.data > newfile

请参见this demo

详细信息

  • N;-在模式空间中添加换行符,然后在  输入到模式空间,如果没有更多输入,则sed  退出而不处理更多命令
  • s/\x0A.*|\([^|]*\)$/\1/-替换为第1组内容a
    • \x0A-换行符
    • .*|-直到最后|
    • 为止的0个字符以上
    • \([^|]*\)-(捕获组1):|以外的任何0+个字符
    • $-行尾

答案 1 :(得分:0)

如果您的数据位于“ d”文件中,请尝试使用gnu awk:

awk 'BEGIN{FS="|"} {if(getline n) {if(n~/batch/){b=split(n,a,"|");print $0 a[b]"\n"n} } }' d