awk 命令未显示预期输出

问题描述 投票:0回答:1

我无法使用以下 awk 命令获得所需的输出。

$ cat /usr/data/doc
8675|Linux|UserA
8975|Linux|UserB
8975|Linux|UserC
8898|Windows|UserD

$ cat go
#!/bin/bash
exec awk -v arg=${1:?} '$1==arg' "${@:2}" /usr/data/doc

$ go 8975

预期输出:

8975|Linux|UserB
8975|Linux|UserC

但是上面的脚本没有提供预期的输出,它显示为空白。

awk
1个回答
0
投票

这个

8675|Linux|UserA
8975|Linux|UserB
8975|Linux|UserC
8898|Windows|UserD

是管道分隔文件,GNU

AWK
默认行为是假设字段分隔符是一个或多个空白字符。你需要通知GNU
AWK
它正在处理管道分隔的文件,这可以通过在
FS
中设置
BEGIN
来完成,即

awk 'BEGIN{FS="|"}$1==8975' /usr/data/doc

或者如果您将

8975
存储为 shell 变量,请说 arg

arg="8975"
awk -v arg="$arg" 'BEGIN{FS="|"}$1==arg' /usr/data/doc

当每个字段中有空格时,此命令可以正常工作,但是 现在没有空间了

需要进一步调查,您现在可以假设管道将始终用作分隔字符还是可能是管道或空格?

如果您想了解更多关于

FS
的信息,请阅读 8 强大的 Awk 内置变量 – FS、OFS、RS、ORS、NR、NF、FILENAME、FNR

(在 GNU Awk 5.1.0 中测试)

© www.soinside.com 2019 - 2024. All rights reserved.