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

Isa*_*ins 16 linux shell awk csv

我有一个很大的 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
Run Code Online (Sandbox Code Playgroud)

我只想选择第 7 列等于 -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
Run Code Online (Sandbox Code Playgroud)

我尝试了以下方法:

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
Run Code Online (Sandbox Code Playgroud)

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

Kus*_*nda 12

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

使用dos2unix将其转换为一个Unix文本文件。

或者,运行它tr

tr -d '\r' <input.txt >input-unix.txt
Run Code Online (Sandbox Code Playgroud)

然后使用input-unix.txt其他正确的awk代码。


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

awk -F, '$7 == "-99\r"' input.txt >output.txt
Run Code Online (Sandbox Code Playgroud)

这考虑了行尾的回车。

或者,

awk -F, '$7 + 0 == -99' input.txt >output.txt
Run Code Online (Sandbox Code Playgroud)

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

相似地,

awk -F, 'int($7) == -99' input.txt >output.txt
Run Code Online (Sandbox Code Playgroud)

也会删除\r.


ton*_*ioc 5

awk -F, '{if($7==-99)print $0}'
Run Code Online (Sandbox Code Playgroud)

会这样做...

  • 就像 `awk -F, '$7 == -99' input.txt`(来自问题)一样,这意味着除了正确获取 `awk` 代码之外,还有其他事情正在发生。 (4认同)