shell脚本中awk -FS和awk -f的区别

3

我是一名新手shell脚本编写者,对于使用的awk -FSawk -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 命令有什么区别。可以有人帮我解释一下这两个命令之间到底发生了什么。谢谢!

2个回答

7
你比想象中更困惑。没有-FS这个东西。 FS是一个包含字段分隔符的变量。 -F是一个选项,它设置FS为它的参数。 -f是一个选项,它的参数是包含要执行的脚本的文件名。
你发布的脚本会产生语法错误,而不是你所说的输出结果,所以我不知道该告诉你什么...

谢谢!我觉得我对这个概念的理解非常糟糕。我的错。感谢您的澄清。我会努力改进的。 - sdgd
从技术上讲,-FS'-'-F "S-"是相同的。因此,echo "QRS-TUV" | awk -FS'-' '{print $1, $2}'输出QR TUV - glenn jackman
这也是我的疑惑。但是当我尝试使用 echo "ABC-DEF" | awk -FS'-' '{print $1,$2}' 时,我只得到了 ABC-DEF。 - sdgd
1
@Dev,这将是预期的输出,因为“S-”(存储在“FS”中)在输入中未出现,因此它只有一个字段,因此“$1”是“ABC-DEF”。如果检查输出,您会发现换行符被添加到行末 - 这是输出字段分隔符(“OFS”)在表示为“$2”的空字符串之前。顺便说一句,关于您错误使用“doubt”一词 - 正确的英语应该是“thought”或“expectation”或类似的词语。“怀疑”是当您对某些事情持否定看法时使用的词语。 - Ed Morton
1
感谢您的纠正,@EdMorton。我很感激。 - sdgd

3

-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命令的FS值设置为S-。您可以通过运行以下命令来查看:

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

1
谢谢!是我不好,需要更多地学习这个概念。感谢您的澄清。我会努力工作的。 - sdgd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接