![读取参数并从中创建临时文件以在脚本中使用](https://linux22.com/image/152086/%E8%AF%BB%E5%8F%96%E5%8F%82%E6%95%B0%E5%B9%B6%E4%BB%8E%E4%B8%AD%E5%88%9B%E5%BB%BA%E4%B8%B4%E6%97%B6%E6%96%87%E4%BB%B6%E4%BB%A5%E5%9C%A8%E8%84%9A%E6%9C%AC%E4%B8%AD%E4%BD%BF%E7%94%A8.png)
我正在尝试编写一个脚本来计算文件中的列数。但是,我不知道该文件的名称是什么。我正在尝试创建一个名为 tempfile 的文件,其中包含来自参数的信息。
这是迄今为止我为名为“columnCounter”的脚本编写的脚本:
#!/bin/bash
read colNumber
count=0
for i in $colNumber
do
count=`expr $count + 1'
done
echo "column number: $count"
只要我有一个包含信息的文件名并按以下格式将其输入终端,上面的代码就可以工作:列计数器。
我尝试添加以下代码的两行,以从终端中的参数创建一个临时文件,然后 cat 该临时文件并将其通过管道传输到 columnCounter。但这是行不通的。
cat $1 > tempfile
cat tempfile | columnCounter
答案1
为了将您的文件名作为参数提供给您需要使用的脚本位置参数
您可以使用以下脚本来完成此操作:
#!/bin/bash
awk '{ print NF; exit }' "$1"
这假设您只关心第一行中的列数。
如果你想找到列数最多的行,你可以这样做:
#!/bin/bash
awk 'NF > max { max = NF } END { print max }' "$1"
这将检查文件中所有行的长度并打印最长的行
现在,如果您想指定分隔符,可以使用多个位置参数:
#!/bin/bash
delim=$1
file=$2
awk -F "$delim" 'NF > max { max = NF } END { print max }' "$file"
这将允许您计算各种文件(例如 csv)中的最大列大小:
./columnCounter , tempfile.csv
为了变得更奇特,我们可以使用getopts
解析参数:
#!/bin/bash
while getopts d:f: opt; do
case $opt in
d) delim=$OPTARG;;
f) file=$OPTARG;;
esac
done
awk -F "$delim" 'NF > max { max = NF } END { print max }' "$file"
这将被称为:
./columCounter -d , -f tempfile.csv