bash - 用 bash 计算列数
问题描述
我需要找到一种方法来计算文件或标准输入中的列,而不使用纯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
解决方案
我会建议 awk 完成这项任务,但如果你需要 bash,你可以使用数组:
let c=0
while read -r myLine; do
a=($myLine)
echo "Line $((++c)) has ${#a[*]} columns"
done < file
该数组由函数a
读取的行的内容填充。read
列数就是数组的长度a
。
请注意,此脚本假定未设置输入字段分隔符IFS
(因此默认<space><tab><newline>
为该read
命令)。
推荐阅读
- docker - 容器以 docker-compose up 开头,以 docker ps 列出,然后不以 docker-compose 出现
- java - 我可以使用 HashMap 在 SpringBoot 中选择要自动装配的接口 (DAO) 吗?
- javascript - JS函数调用有效
- firebase - Firestore 安全访问角色系统
- kubernetes - Kubernetes pod 中多个 emptyDir 的后果是什么?
- javascript - useEffect 依赖数组中的 [history.push] 是否会导致重新渲染?
- elasticsearch - 从弹性搜索上的子聚合访问嵌套变量
- html - 如何移动文本装饰下划线属性使其不会破坏文本
- javascript - 即使javascript条件为假也运行的PHP函数(document.write(
)) - c# - 如何在 Azure EventGrid 中的一批事件中触发重试/死信特定事件