【问题标题】:Count columns with bash用 bash 计算列数
【发布时间】:2019-09-26 05:33:12
【问题描述】:

我需要找到一种方法来计算文件或标准输入中的列,而不使用除了 pure bash 之外的任何东西。到目前为止我所拥有的......

input="${1:-/dev/stdin}"
rows=0
while read -r myLine
do
    a=($myLine)
    cols=(${#a[*]})
    rows=`expr $rows + 1`
done < $input

echo -e "$rows $cols"

我正在计算行数和列数。现在,我的列数仅适用于文件,不适用于标准输入。

有什么建议吗?

我正在运行以下命令

echo -e "1\t2\n3\t4" > m1, ./matrix m1
echo -e "1\t2\n3\t4" | matrix

【问题讨论】:

  • 只需使用wc -lw &lt; $input 即可在一次读取操作中获取您需要的所有统计信息。字数除以行数就是列数。
  • 纯 bash 是什么意思?您的代码中有headwc
  • 我不能使用除了 bash shell 脚本之外的任何东西,所以不能使用 awk、sed、tcl、bc、perl 和 python 语言。
  • 如果当前年份以 2 开头,您真的不需要 expr。Bash 具有出色的内置算法。

标签: bash


【解决方案1】:

我建议使用 awk 来完成这项任务,但如果你需要 bash,你可以使用数组:

let c=0
while read -r myLine; do 
  a=($myLine) 
  echo "Line $((++c)) has ${#a[*]} columns"
done < file

数组a 填充了read 函数读取的行的内容。 列数就是数组的长度a

请注意,此脚本假定输入字段分隔符 IFS 未设置(因此对于 read 命令,默认为 &lt;space&gt;&lt;tab&gt;&lt;newline&gt;)。

【讨论】:

  • echo 是多余的;只需 a=($myLine) 将字符串标记到数组中。此外,您基本上总是希望使用 read -r,除非您特别需要旧的 pre-POSIX 行为以实现向后兼容性。 (不过,如果 myLine 包含通配符表达式,它也会在评估之前被扩展。)
  • @tripleee 感谢您的提示。我不确定您是否理解您与 -r 选项相关的评论,该选项在手册页中描述为 Backslash does not act as an escape character.
  • 如果您在read 中输入反斜杠,原来的 Bourne shell 会做一些有趣的事情。 -r 选项将其关闭。
  • 不错!谢谢你。快速提问。有没有办法只做第一行的列数?
  • @CoryAllen 是的,只需添加一个if 语句来检查c 的列数为1。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多