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

0yg35tkg  于 2022-12-06  发布在  其他
关注(0)|答案(5)|浏览(174)

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

column1,column2,column3,column4,column5,column6

如何使用awk打印出第三列?

6l7fqoea

6l7fqoea1#

试试看:

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

在这里,在-F中,您要对awk说使用,作为字段分隔符。

62lalag4

62lalag42#

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

cut -d, -f3 file
  • -d,将分隔符设置为逗号
  • -f3指定只打印第三个字段
z2acfund

z2acfund3#

试试这个awk

awk -F, '{$0=$3}1' file
column3
  • ,将字段除以,
  • $0=$3将行设置为仅字段3
  • 1打印全部输出。(explained here

这也可以用于:

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

bq3bfh9z4#

bash中的一个简单但awk较少的解决方案:

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

对于小文件(〈100行),它比awk运行得更快,因为它使用的资源更少(避免调用昂贵的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

我希望如果你得到一个足够小的文件,那么你会看到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

$
daupos2t

daupos2t5#

您也可以使用sed,例如:
echo '"A","B","C"'| sed -e 's/\([^,]*\),\([^,]*\),\([^,]*\)/\3 \2 \1/'将输出"C" "B" "A"

相关问题