使用awk解析空间分隔的文本文件

使用awk解析空间分隔的文本文件,awk,gawk,Awk,Gawk,有人能帮我用awk解析吗? 对不起,我没有任何代码 我的输入空间分隔文本文件(该文件在项目行中还有几个字段) 必需的制表符分隔输出文件 fruits item id 8837878 fruits item id 8837879 fruits item id 8837880 fruits item id 8837881 fruits item id 8837882 fruits item id 8837883 fruits item id 8837884 fruits item id

有人能帮我用awk解析吗?
对不起,我没有任何代码 我的输入空间分隔文本文件(该文件在项目行中还有几个字段)

必需的制表符分隔输出文件

fruits item id  8837878
fruits item id  8837879
fruits item id  8837880
fruits item id  8837881
fruits item id  8837882
fruits item id  8837883
fruits item id  8837884
fruits item id  8837885
fruits item id  8837886
fruits item id  8837887
fruits item id  8837888
fruits item id  8837889
veg item id  8837890
veg item id  8837891
veg item id  8837892
.....
这是一种尝试:

如果第二个字段中有一行包含“is”,那么我们将存储类别名称,打印一个空行并继续检查文件

在其他情况下,如果第二个字段是“id”,则打印类别名称前面的行

$ awk '$2=="is"{c=$3; print ""}$2=="id"{print c,$0}' file

fruits item id  8837878
fruits item id  8837879
fruits item id  8837880
fruits item id  8837881
fruits item id  8837882
fruits item id  8837883
fruits item id  8837884
fruits item id  8837885
fruits item id  8837886
fruits item id  8837887
fruits item id  8837888
fruits item id  8837889

veg item id  8837890
veg item id  8837891
veg item id  8837892
veg item id  8837893
veg item id  8837894
veg item id  8837895
veg item id  8837896
veg item id  8837897

带awk的单向开关:

$ awk '/^category/{c=$3}/^item/{print c,$0}' file
fruits item id  8837878
fruits item id  8837879
fruits item id  8837880
fruits item id  8837881
fruits item id  8837882
fruits item id  8837883
fruits item id  8837884
fruits item id  8837885
fruits item id  8837886
fruits item id  8837887
fruits item id  8837888
fruits item id  8837889
veg item id  8837890
veg item id  8837891
veg item id  8837892
veg item id  8837893
veg item id  8837894
veg item id  8837895
veg item id  8837896
veg item id  8837897
要精确设置输出格式,可以使用
printf

$ awk '/^category/{c=$3}/^item/{printf "%s %s %s %d\n",c,$1,$2,$3}' file
所以,通过制表符分隔的输出,您的意思可能是:

$ awk '/^category/{c=$3}/^item/{printf "%s %s %s\t%d\n",c,$1,$2,$3}' file

我喜欢短正则表达式匹配,但sting比较会更紧密
awk'$2==”是“{c=$3}$2==”id“{print c,$0}”文件
+1。谢谢,@sudo_O,我总是从你的评论和回答中学到很多东西!相应更新。解释为+1。也可以使用空行作为分隔符。它使输出看起来很好,尽管OP没有说他是否需要它。看这个问题,我想按
Ctrl-V
+1。纯溶液。最好添加“制表符分隔输出”部分。我错过了@Kent部分,谢谢你指出。在我的答案中添加了
printf
。我不得不用“我不太熟悉在Windows上引用的细微差别”替换“因为我正在使用Gawk for Windows-GnuWin32运行它。但是,当我用“我不太熟悉在Windows上引用的细微差别”替换“printf”时,带有printf的代码会出现语法错误。一个快速修复方法是将脚本放入一个文件中。因此,将
/^category/{c=$3}/^item/{printf“%s%s%s\t%d\n”、c、$1、$2、$3}
放入
script.awk
并运行
awk-f script.awk文件。作品很棒:)
$ awk '/^category/{c=$3}/^item/{printf "%s %s %s\t%d\n",c,$1,$2,$3}' file