我试图用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
答案 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
substr(string,start,length)
返回字符串的长度为字符长的子字符串,从 字符编号开始。字符串的第一个字符是字符 第一。例如,substr(“washington”,5,3)返回“ing”。如果 length不存在,此函数返回整个后缀 从字符编号开始的字符串。例如, substr(“washington”,5)返回“ington”。如果是这样的话 长度大于剩余的字符数 字符串,从字符编号开始计算。
答案 1 :(得分:0)
sed -nr '1~4{s/^.{4}//;s/.{4}$//p};1~4!{s/^.{26}//p}' file
当行号为1,5,9时。1~4
从行和打印行中删除第一个和最后四个字符。
否则1~4!
从行中删除前26个字符然后打印。