【问题标题】:Byte count in file unix per line文件unix中每行的字节数
【发布时间】:2015-01-06 14:11:13
【问题描述】:

我想计算文件中所有行的字节数大于一个值(比如 10)。我该怎么做?

我尝试使用 cat file | awk'length($0)>10' 但这给了我所有字符数大于 10 的行。我想计算行中的字节数。

我写了下面的代码,但它不工作。它返回一些乱码输出:

#!/bin/ksh
file="a.txt"
while read line
do
    a=`wc -c "${line}"|awk {'print $1'}`
    if [ $a -ne 493]; then
    echo "${line}"
    fi
done <"$file"

【问题讨论】:

  • 您可能需要wc -c 获取字节。
  • 这会给我整个文件的计数。我想要字节数大于给定值的行
  • 可以逐行阅读,然后echo "$line" | wc -w
  • 您如何区分什么是“字节”和什么是“字符”?除非您使用像 UTF-8 这样的多字节编码,否则它们可能是相同的......
  • @fedorqui 我知道有时会有所不同。我想我的措辞很糟糕——我试图理解的是这里使用了哪种特定的字节映射(又名编码)。对于某些(不太常见的)编码,找到合适的工具可能并不那么简单,而使用更常见的 UTF-* 和/或 ISO 8859-* 以及其他一些编码可能是可行的......

标签: shell unix ksh


【解决方案1】:

你的方法很好,只是你必须做a=$(wc -c &lt;&lt;&lt; "$line")a=$(echo "$line" | wc -w),不需要管道到awk。另外,请注意在if 条件中493 之后需要一个额外的空格。

大家一起:

#!/bin/ksh
file="a.txt"
while read line
do
    a=$( echo -n "$line" | wc -c) # echo -n to prevent counting new line
    if [ "$a" -ne 493 ]; then
      echo "${line}"
    fi
done <"$file"

【讨论】:

  • 能否将文件名改为a.txt。我是你的答案
  • 如果你使用bash你可以用a=${#line}得到长度
  • @MarkSetchell 是的,只是 OP 想要以字节为单位的长度,而不是字符,我猜 ${#var} 返回字符。如果我们说r="hàllo"(那里有重音符号),那么echo ${#r} 返回5,而echo "hàllo" | wc -c 返回7。 // 如果我们说r="hallo"(没有重音符号),echo ${#r} 返回5,而echo "hallo" | wc -c 返回6.
  • 您需要echo -n 以防止换行符被包含在计数中。
猜你喜欢
  • 2017-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-18
  • 1970-01-01
相关资源
最近更新 更多