使用 AWK 选择特定列中具有特定值的行

使用 AWK 选择特定列中具有特定值的行

我有一个很大的 csv 文件,如下所示:

1,2,3,4,5,6,-99
1,2,3,4,5,6,-99
1,2,3,4,5,6,-99
1,2,3,4,5,6,25178
1,2,3,4,5,6,27986
1,2,3,4,5,6,-99

我只想选择第七列等于 -99 的行,所以我的输出是:

1,2,3,4,5,6,-99
1,2,3,4,5,6,-99
1,2,3,4,5,6,-99
1,2,3,4,5,6,-99

我尝试了以下方法:

awk -F, '$7 == -99' input.txt > output.txt
awk -F, '{ if ($7 == -99) print $1,$2,$3,$4,$5,$6,$7 }' input.txt > output.txt

但他们都返回了一个空的output.txt。谁能告诉我我做错了什么?谢谢。

答案1

您运行脚本的文件具有 DOS 行结尾。它可能是在 Windows 计算机上创建的。

用于dos2unix将其转换为 Unix 文本文件。

或者,通过以下方式运行它tr

tr -d '\r' <input.txt >input-unix.txt

然后使用input-unix.txt您原本正确的awk代码。


要修改awk代码而不是输入文件:

awk -F, '$7 == "-99\r"' input.txt >output.txt

这会考虑行末尾的回车符。

或者,

awk -F, '$7 + 0 == -99' input.txt >output.txt

这会强制将第七列解释为数字,从而“删除”回车符。

相似地,

awk -F, 'int($7) == -99' input.txt >output.txt

还将删除\r.

答案2

awk -F, '{if($7==-99)print $0}'

会这样做...

答案3

awk -F',' '$7 ~ /-99/ {print $0}' filename.csv > result.csv
  1. 请注意,将','分隔符定义为逗号。

  2. $定义列。因此,$7定义您想要具有特殊值的列号。这里7

  3. ~ /-99/搜索-99.你可以放任何你需要的东西。

  4. $0代表文件中的所有列。$1","$2","......如果您不想只打印特定列,您可以简单地编写。(或者$1$2...如果您不需要逗号作为结果的分隔符)

  5. > result.csv保存输出而不是将其打印在result.scv文件的终端中。

答案4

聚会有点晚了..但这应该可以了

awk -F, '$7 ~ /-99/' input.txt > output.txt

如果您添加引号,您的原件也将起作用,就像这样

awk -F, '$7 == "-99"' input.txt > output.txt

使用模式匹配时的默认操作是打印,因此{print}不需要

相关内容