我有这个文件
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
你似乎想要:
- 每行的最后两个字段
AK3
,后面是 - 罚球线上的第四和第五场
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