awk多条件输出顺序

时间:2016-04-21 07:47:39

标签: bash awk

我试图用awk格式化文本文件。文本文件如下所示:

[----aaa1----]
**************************something1
**************************text1
**************************blabla1
[----aaa2----]
**************************something2
**************************text2
**************************blabla2
[----aaa3----]
**************************something3
**************************text3
**************************blabla3

我正在使用这个awk命令

awk 'NR % 4 == 1 {print | "rev | cut -c6- | rev | cut -c6-" } \
NR % 4 == 2 {print | "cut -c27-" } NR % 4 == 3 {print | "cut -c27-" } \
NR % 4 == 0 {print | "cut -c27-" }' so_test.txt

我期待这样的输出:

aaa1
something1
text1
blabla1
aaa2
something2
text2
blabla2
aaa3
something3
text3
blabla3

但我得到了这个:

something1
text1
blabla1
something2
text2
blabla2
something3
text3
blabla3
aaa1
aaa2
aaa3

有人可以告诉我为什么以及如何解决它?

修改 让我澄清一下,我想要格式化的实际文件是几千行,并且数据与作为示例给出的数据不同。我无法按特殊字符过滤,因为文件中的数据包含特殊字符等。 Basicaly每4行遵循这种模式

[92m/File/Path/here[00m
FileId                    0B01O-JsvW0LMDaI1B1RYOTQ1NVE  
ModTime                   2016-03-30 12:12:29 +0000 UTC 
LastModifyingUsername     User Name 

2 个答案:

答案 0 :(得分:3)

使用substr打印特定字符可能更好:

awk 'NR%4==1{print substr($0,6, 4); next} {print substr($0, 27)}' file

当行在4N + 1表格上时,从第6个字符打印到第10个字符。其余的,从27日开始打印到最后。

它返回:

aaa1
something1
text1
blabla1
aaa2
something2
text2
blabla2
aaa3
something3
text3
blabla3

来自awk manual -> strings

  

substr(string,start,length)

     

返回字符串的长度为字符长的子字符串,从   字符编号开始。字符串的第一个字符是字符   第一。例如,substr(“washington”,5,3)返回“ing”。如果   length不存在,此函数返回整个后缀   从字符编号开始的字符串。例如,   substr(“washington”,5)返回“ington”。如果是这样的话   长度大于剩余的字符数   字符串,从字符编号开始计算。

答案 1 :(得分:0)

使用sed:

sed  -nr '1~4{s/^.{4}//;s/.{4}$//p};1~4!{s/^.{26}//p}' file

当行号为1,5,9时。1~4从行和打印行中删除第一个和最后四个字符。 否则1~4!从行中删除前26个字符然后打印。