我有一个很大的 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
请注意,将
','
分隔符定义为逗号。$
定义列。因此,$7
定义您想要具有特殊值的列号。这里7
。~ /-99/
搜索-99
.你可以放任何你需要的东西。$0
代表文件中的所有列。$1","$2","......
如果您不想只打印特定列,您可以简单地编写。(或者$1$2...
如果您不需要逗号作为结果的分隔符)> result.csv
保存输出而不是将其打印在result.scv
文件的终端中。
答案4
聚会有点晚了..但这应该可以了
awk -F, '$7 ~ /-99/' input.txt > output.txt
如果您添加引号,您的原件也将起作用,就像这样
awk -F, '$7 == "-99"' input.txt > output.txt
使用模式匹配时的默认操作是打印,因此{print}
不需要