我需要从文本文件中检索特定信息:
Barnes and Kolling, 9780131976290,480, Pearson, Objects First with Java, LM002411,3989,781,true
Aho Sethi and Ullman, 9780201101942,795, Addison-Wesley, Compilers: Principles Techniques and Tools, LM002711,599,0,FALSE
Harvey Paul and Jeffrey, 9780130622211,1568, Prentice Hall, C# How to Program, LM002876,4599,45,TRUE
Muster, 9780072193145,1011, McGraw-Hill, Unix Made Easy: The Basics and Beyond (Made Easy), LM002468,6395,0,TRUE
Thomee, 9783540331216,370, Springer Verlag, Galerkin Finite Element Methods for Parabolic Problems, LM002153,4554,0,FALSE
要检索的信息:
Java 对象优先
编译器:原理、技术和工具
C# 如何编程
Unix 让一切变得简单:基础知识及其他 (Made Easy)
抛物线问题的 Galerkin 有限元方法
答案1
cut -d , -f 5 FILE
将产生您需要的结果。这将拉出第五列,以逗号分隔符分隔。
答案2
最简单的解决方案,假设数据字段中没有嵌入的逗号或换行符,是使用cut -d , -f 5 file
,可能需要进行一些后处理来消除这将留下的初始空白字符(sed 's/^[[:blank:]]*//'
将删除这些字符)。
除非您有一个能够理解该选项grep
的非标准变体,否则无法提取数据。标准仅提取匹配grep
-o
grep
线从文件中。
使用正则表达式匹配特定字段非常繁琐,并且通常会导致代码不可读(因此无法维护),一旦发现极端情况就会中断。
在这种情况下,最好使用知道如何将输入划分为单独字段的工具,如上cut
或awk
(下)。如果事实证明您的数据实际上是一个 CSV 文件,您可能需要查看csvkit
其实csvcut
用程序,因为 CSV 是一种结构化格式,具有特殊的引用和编码规则,诸如 、 、 和 之类的简单工具grep
将sed
难以awk
应对。
awk -F ',[[:blank:]]*' '{ print $5 }' file
这使用正则表达式指定数据中的分隔符(逗号后跟可选空格)。第五个这样的字段被提取并打印在每行上。
这假设没有字段包含嵌入的逗号(或换行符)。
给定问题中的输入,这将生成
Objects First with Java
Compilers: Principles Techniques and Tools
C# How to Program
Unix Made Easy: The Basics and Beyond (Made Easy)
Galerkin Finite Element Methods for Parabolic Problems
你也可以sed
像这样使用 GNU:
tr ',' '\n' <file | sed '5~9!d; s/^[[:blank:]]*//'
这只是用换行符替换所有逗号,然后打印从第 5 行开始的每第 9 行(实际上删除不是这些行中的每一行,并打印其余行)。 A使用正则表达式在打印之前删除每行开头的初始空白。
只是为了好玩:
由于您实际上想要每行九个字段的中间字段,因此我们可以剥离第一个和最后一个字段,然后重复此操作,直到没有其他字段可以剥离为止。
s/^[^,]*,//
可以使用in删除开头的字段sed
,可以使用 删除末尾的字段s/,[^,]*$//
。如果最近的命令发生了更改,则命令t
会分支到给定的标签。该命令引入了一个标签。sed
s///
:
$ sed -e ': again' -e 's/^[^,]*,//; s/,[^,]*$//' -e 't again' -e 's/^[[:blank:]]*//' file
Objects First with Java
Compilers: Principles Techniques and Tools
C# How to Program
Unix Made Easy: The Basics and Beyond (Made Easy)
Galerkin Finite Element Methods for Parabolic Problems
答案3
我假设您的标题后面带有LM...
.这是适合您的正则表达式:
sed "s/\([^,]*, *\)\{4\}\(.*\), LM.*/\2/" booksdata
数据包含在文件中booksdata
。正则表达式\([^,]*, *\)\{4\}
捕获 4 个字段实例,,
末尾用可选空格分隔。使用LM...
允许在书名中包含逗号。