使用 unix 脚本的 AWK 问题

使用 unix 脚本的 AWK 问题

我有这个文件

AK3*BPS*2
AK4*8*0510*1
AK3*RMT*12
AK4*1*0128*7*CR

我想要这个输出

BPS 2  1
RMT 12 7 CR

我正在使用这个命令

awk -F* '$1=="AK3" { print $2, $3 } "\c" ($1=="AK4" { print $4, $5 }' $FileHome/badfile_$session_num.txt >>  $FileHome/input_output_record.txt

但我得到这个结果

BPS 2
1
RMT 12
7 CR

任何提示将不胜感激

答案1

你似乎想要:

  1. 每行的最后两个字段AK3,后面是
  2. 罚球线上的第四和第五场AK4(第五场可能会丢失)。
$ awk -F '*' '/^AK3/ { printf("%s\t%s", $2, $3) } /^AK4/ { printf("\t%s\t%s\n", $4, $5) }' data.in
BPS     2       1
RMT     12      7       CR

答案2

另一种方式是直接控制输出记录分隔符(ORS)

$ awk -F'*' '$1=="AK3"{ORS=OFS; print $2, $3} $1=="AK4"{ORS=RS; print $4, $5}' ip.txt
BPS 2 1 
RMT 12 7 CR
  • 默认情况下,输出字段分隔符(OFS)为单个空格
  • 并且输入记录分隔符(RS)是换行符

这很容易针对不同的 OFS 进行修改,并且还显示空字段

$ awk -F'*' -v OFS=',' '$1=="AK3"{ORS=OFS; print $2, $3} $1=="AK4"{ORS=RS; print $4, $5}' ip.txt
BPS,2,1,
RMT,12,7,CR

答案3

Plainprint会添加换行符(输出记录分隔符),但printf不会,因此我们可以在AK3字段之间具有显式分隔符的情况下使用它。在这种AK4情况下,我们希望在第一个字段之前有一个字段分隔符,最简单的方法是首先打印一个空字段。

$ awk -F\* '$1=="AK3" { printf "%s", $2 OFS $3 } $1=="AK4" { print "", $4, $5 }' < input 
BPS 2 1 
RMT 12 7 CR

这很容易转换为提供制表符间隔的输出,只需添加-vOFS='\t'到命令行的开头即可。

不过,如果您想要固定宽度的列,那么使用格式printf上的宽度设置可能是最简单的%s

$ awk -F\* '$1=="AK3" { printf "%-3s %-2s", $2, $3 } $1=="AK4" { printf " %-1s %s\n", $4, $5 }' < input
BPS 2  1 
RMT 12 7 CR

过长的字段仍然会扩展,除非您也给出最大字段宽度,例如%-3.3s,如果输入行的顺序不正确,这将产生损坏的输出。

答案4

我通过以下命令达到了结果


sed -n '1~2p' testfile.txt| awk -F "*" '{print $2,$3}'  >> op.txt
sed -n '2~2p' testfile.txt | awk -F "*" '{print $4,$5}' >> op.txt

sed -n '1~2p' op.txt |sed "N;s/\n/ /g" |awk '{print $0"\n"}'; sed -n '2~2p' op.txt| sed "N;s/\n/ /g"

输出


基点 2 1

RMT 12 7 CR



相关内容