如何使用算术扩展和 wc 从 bash 脚本中的文件字符数中划分单词数
How to divide the number of words from the number of characters of a file in bash script using arithmetic expansion and wc
这是我的作品:
wc -w /lab1.txt
words=$(wc -w /lab1.txt)
wc -m /lab1.txt
characters=$(wc -m /lab1.txt)
echo $((characters / words))
我设置的两个变量工作得很好,它们给出了正确的输出,但是当我尝试使用算术扩展将字符与单词分开时。我得到一个错误,我不知道我是否可以这样做。
这是错误:
enter image description here
您将 wc -w
和 wc -m
的全部输出分配给变量,变量后跟文件名。所以你的变量实际上是:
words="3 /Users/example/lab1.txt"
characters="16 /Users/example/lab1.txt"
现在当 Bash 计算 $(( characters / words ))
时,它实际上在做:
16 /Users/example/lab1.txt / 3 /Users/example/lab1.txt
在算术展开中,未设置的变量被视为零,因此 Users=0
和 Bash 尝试除法,并给出错误输出。
您应该从 wc -w
中提取输出的数字部分。一个例子是 cut
:
words=$(wc -w /lab1.txt | cut -d' ' -f1)
characters=$(wc -m /lab1.txt | cut -d' ' -f1)
echo $((characters / words)) # Voila!
如果您对前导空格没有信心,请使用 AWK:
words=$(wc -w /lab1.txt | awk '{print }')
您使用 wc
命令的方式有误。如果你想得到数字 - 只有 数字 - 在你的输出中,wc
必须从标准输入读取。因此,如果您执行
words=$(wc -w </lab1.txt)
characters=$(wc -m </lab1.txt)
echo $((characters / words))
你不会再收到错误了。
这应该可以回答您的问题,但一方面要注意:由于您使用的是 bash,因此除法被截断为一个整数,并且您不必要地解析了输入文件两次。如果这对您的应用程序来说是个问题,您或许可以完全重新考虑您的方法。
这是我的作品:
wc -w /lab1.txt
words=$(wc -w /lab1.txt)
wc -m /lab1.txt
characters=$(wc -m /lab1.txt)
echo $((characters / words))
我设置的两个变量工作得很好,它们给出了正确的输出,但是当我尝试使用算术扩展将字符与单词分开时。我得到一个错误,我不知道我是否可以这样做。
这是错误: enter image description here
您将 wc -w
和 wc -m
的全部输出分配给变量,变量后跟文件名。所以你的变量实际上是:
words="3 /Users/example/lab1.txt"
characters="16 /Users/example/lab1.txt"
现在当 Bash 计算 $(( characters / words ))
时,它实际上在做:
16 /Users/example/lab1.txt / 3 /Users/example/lab1.txt
在算术展开中,未设置的变量被视为零,因此 Users=0
和 Bash 尝试除法,并给出错误输出。
您应该从 wc -w
中提取输出的数字部分。一个例子是 cut
:
words=$(wc -w /lab1.txt | cut -d' ' -f1)
characters=$(wc -m /lab1.txt | cut -d' ' -f1)
echo $((characters / words)) # Voila!
如果您对前导空格没有信心,请使用 AWK:
words=$(wc -w /lab1.txt | awk '{print }')
您使用 wc
命令的方式有误。如果你想得到数字 - 只有 数字 - 在你的输出中,wc
必须从标准输入读取。因此,如果您执行
words=$(wc -w </lab1.txt)
characters=$(wc -m </lab1.txt)
echo $((characters / words))
你不会再收到错误了。
这应该可以回答您的问题,但一方面要注意:由于您使用的是 bash,因此除法被截断为一个整数,并且您不必要地解析了输入文件两次。如果这对您的应用程序来说是个问题,您或许可以完全重新考虑您的方法。