使用Awk命令行打印以逗号分隔的列


77

我在这里有问题。我必须使用awk在文本文件中打印一列。但是,这些列根本没有用空格分隔,仅使用了一个逗号。看起来像这样:

column1,column2,column3,column4,column5,column6

我将如何使用awk打印第三列?


1
为什么要使用awk?恕我直言,这是一个非常简单的问题。您有解决的办法吗?
2014年

Answers:


121

尝试:

awk -F',' '{print $3}' myfile.txt

在-F中,您说的是awk,它使用“,”作为字段分隔符。


我已经浏览了很多页面,并且得到了更多的结果,这是迄今为止最好的:)谢谢
AJC

40

如果您唯一的要求是打印每行的第三个字段,并且每个字段都用逗号分隔,则可以使用cut:

cut -d, -f3 file
  • -d, 将定界符设置为逗号
  • -f3 指定仅要打印第三个字段

1
这是此问题的最佳答案。awk可以说我想[col1]:[col5]使用不同的
del

26

试试这个 awk

awk -F, '{$0=$3}1' file
column3
  • , 将字段除以 ,
  • $0=$3 将行设置为仅字段 3
  • 1打印全部。(在这里说明

也可以使用:

awk -F, '{print $3}' file

4
除了更短之外,对于不熟悉awk的人来说,这要困难得多。值得添加一些解释以使此答案更有用。
Tom Fenech

1
+1。有点神秘,但是像沙夫豪森一样工作。
2014年

1
@TomFenech:cut -d, -f3 file如果有人不熟悉的话,我认为这和这一样神秘cut。;)
TrueY 2014年

3
@TrueY被授予,尽管一个区别是cut --help它将解释您需要知道的所有内容,而awk --help不会。也许我应该去cut --delimiter=, --fields=3 file,尽管我怀疑较长的开关是否可以携带:)
Tom Fenech 2014年

2

一个简单的,虽然 较少的解决方案

while IFS=, read -r a a a b; do echo "$a"; done <inputfile

对于较小的文件(<100行),它的工作速度更快,然后 因为它使用较少的资源(避免调用昂贵的调用forkexecve系统调用)。

埃德·莫顿(Ed Morton)的编辑(对不起,您无法回答这个问题,我不知道是否有更好的方法来解决此问题):

为了消除神话,shell对于小文件的运行速度比awk快:

$ wc -l file
99 file

$ time while IFS=, read -r a a a b; do echo "$a"; done <file >/dev/null

real    0m0.016s
user    0m0.000s
sys     0m0.015s

$ time awk -F, '{print $3}' file >/dev/null

real    0m0.016s
user    0m0.000s
sys     0m0.015s

我希望,如果您得到一个足够小的REALY文件,那么您会看到shell脚本比awk脚本运行的时间短一点,但是谁在乎呢?

而且,如果您不认为编写健壮的Shell脚本比awk脚本更难,请查看发布的Shell脚本中的以下错误:

$ cat file
a,b,-e,d
$ cut -d, -f3 file
-e
$ awk -F, '{print $3}' file
-e
$ while IFS=, read -r a a a b; do echo "$a"; done <file

$

1
While read循环比awk慢得多,即使使用小文件更快,但速度差异却可忽略不计。

@吉德:你是对的!恕我直言,这就是为什么对小文件使用awk毫无意义的原因。
TrueY 2014年

1
@EdMorton:你是对的。对于更大,更复杂的问题,我绝对使用awk(通常从bash脚本调用),但是对于小文件和简单任务,我使用pure bash。另一方面,对于更复杂的工作,我更喜欢用perl编写脚本。
TrueY 2014年

1
@EdMorton:您又说对了,似乎echo无法轻松解决。在这种情况下,可以使用printf "%s\n" "$a"摆脱掉。这也是bash的内置功能。
TrueY 2014年

1
@EdMorton:你是对的!如果有人使用任何工具,他/她需要知道可能的问题。因此,我建议任何人都使用适当的工具。如果我写一个内核模块,我肯定不会使用bash。;)但对于这样一个繁琐的任务,可能就足够了。
2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.