我想在每隔一行(奇数行)的后面加上最后一行(偶数行)的最后一列。我尝试了几种不同的命令,但是似乎没有一个命令可以完成我要实现的任务。
原始数据:
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
谢谢!
答案 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
demo和another 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
-换行符.*|
-直到最后|
和\([^|]*\)
-(捕获组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