【问题标题】:Difference between awk -FS and awk -f in shell scriptingshell 脚本中 awk -FS 和 awk -f 的区别
【发布时间】:2015-04-23 17:15:14
【问题描述】:

我是 shell 脚本的新手,我很困惑 awk -FS 和 awk -f 使用的命令。我已经尝试阅读多页关于这两者之间的区别,但无法清楚地理解。请帮忙。 这是一个例子: 让我们考虑一个文本文件,data.txt 具有以下详细信息。

S.No Product Qty Price
1-Pen-2-10
2-Pencil-1-5
3-Eraser-1-2

现在,当我尝试使用以下命令时:

$ awk -f'-' '{print $1,$2} data.txt

我得到以下输出:

1 Pen
2 Pencil
3 Eraser

但是当我使用命令时:

$ awk -FS'-' '{print $1,$2} data.txt

输出是:

1-Pen-2-10
2-Pencil-1-5
3-Eraser-1-2

我不明白使用-FS 命令的区别。有人可以帮助我了解这两个命令之间究竟发生了什么。谢谢!

【问题讨论】:

    标签: linux bash shell awk


    【解决方案1】:

    -FS 不是 awk 的参数。 -F 和 -f 一样。

    -F 参数告诉 awk 为 FS(字段分隔符)使用什么值。

    -f 参数告诉 awk 将其参数用作要运行的脚本文件。

    这个命令(我修正了你的引用):

    awk -f'-' '{print $1,$2}' data.txt
    

    告诉 awk 使用标准输入(这就是 - 的意思)作为它的参数。在终端中运行时应该挂起。之后应该是一个错误,因为 awk 然后尝试使用 '{print $1,$2}' 作为要读取的文件名。

    这个命令:

    awk -FS'-' '{print $1,$2}' data.txt
    

    告诉 awk 使用S- 作为FS 的值。你可以通过运行这个命令看到:

    awk -FS'-' 'BEGIN {print "["FS"]"}'
    

    【讨论】:

    • 谢谢!我的错。需要更多地研究这个概念。感谢您的澄清。会努力的。
    【解决方案2】:

    你比你想象的更困惑。没有-FS。

    FS 是一个包含字段分隔符的变量。

    -F 是一个将FS 设置为其参数的选项。

    -f 是一个选项,其参数是包含要执行的脚本的文件的名称。

    您发布的脚本会产生语法错误,而不是您说它们产生的输出,所以不知道该告诉您什么...

    【讨论】:

    • 谢谢!我想我非常理解这个概念。我的错。感谢您的澄清。会努力的。
    • 技术上-FS'-' 与-F "S-" 相同。所以,echo "QRS-TUV" | awk -FS'-' '{print $1, $2}' 输出 QR TUV
    • 这也是我的疑惑。但是当我尝试使用 echo "ABC-DEF" | awk -FS'-' '{print $1,$2}' 时,我只得到 ABC-DEF
    • @Dev 这将是预期的输出,因为S-(存储在FS)不会出现在您输入的任何地方,因此它只有一个字段,因此$1 是ABC-DEF。如果您检查输出,您会在行尾添加一个空白字符 - 这是由$2 表示的空字符串之前的输出字段分隔符 (OFS)。顺便说一句,你错误地使用了doubt这个词——正确的英文应该是thought或expectation或类似的。 doubt 是当您对某事产生负面看法时。
    • 感谢@EdMorton 的更正。我很感激。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-11
    • 1970-01-01
    • 2014-09-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多