根据来自CSV的列值获取行

时间:2019-04-01 16:47:45

标签: awk

我有一个csv,其中包含以下数据

10.000.00.00,D3,1
10.001.00.00,C4,2
10.002.00.00,C5,2
10.000.88.99,B1,3
10.000.00.00,B2,3
10.000.00.00,C6,3
10.000.99.00,D1,3

尝试以下代码

cat Data.csv | awk -F , '$3 == "3" { print }'

仅需要获取最后一个值为3的行。

请让我知道该怎么做

4 个答案:

答案 0 :(得分:5)

使用awk 仅获取最后值为3的行

$ awk -F, '$NF==3' file
10.000.88.99,B1,3
10.000.00.00,B2,3
10.000.00.00,C6,3
10.000.99.00,D1,3

解释:

awk -F, '  # set the field separator to a comma
$NF==3     # NF is the last field, $NF last field value (see comments for more
' file                                                  #thanks @kvantour)

答案 1 :(得分:2)

您可以尝试使用sed:

sed '/,3$/!d' infile

如果行尾可以有\ r,请尝试以下方式:

sed '/,3\r*$/!d' infile

答案 2 :(得分:2)

  

为什么我们首先需要awksed进行这种操作???难道不是太强了吗?

     

OP正在询问有关提取满足特定条件的某些行的信息   条件,甚至不需要修改其格式...

grep 的完美工具。

$ grep ',3$' Data.csv 
10.000.88.99,B1,3
10.000.00.00,B2,3
10.000.00.00,C6,3
10.000.99.00,D1,3

如果您有Windows EOL,最终grep -E ',3\r?$' Data.csv

也请尽量避免使用cat <FILE> | <COMMAND>,而是直接将文件传递给命令或将stdin从文件重定向到命令(Command < file)。

答案 3 :(得分:0)

您可以为此使用内置的awk变量。

在我们的情况下

  

'$ NF'-NF用于当前记录中的字段数

awk -F, '{if($NF == 3) {print $0} }' Data.csv
10.000.88.99,B1,3
10.000.00.00,B2,3
10.000.00.00,C6,3
10.000.99.00,D1,3

您可以通过以下链接了解有关内置变量的更多信息: Awk Built in Variables