我有一个文件“input.txt”,其中包含变量 A1、A2、A3、θ、θ1 和 θ2 - input.txt 的示例如下:
$ cat input1.txt
A1=5.2 A2=4.9 A3=6.1 θ=space θ1=2.5 θ2=1.2
A1=3.1 A2=5.1 A3=3.7 θ=triangle θ1=8.1 θ2=3.9
我想创建一个脚本来运行文件 input.txt - 该文件将作为第二个参数传递,第一个参数将是 θ 的值
我创建了一个脚本,如下所示:
#! /bin/bash
file=input1.txt
if grep -q $1 "$file";
then
awk -F '[= ]+' '{ print $12 }' <$2
else
echo "Not available"
fi
}
但是当我按如下方式运行此脚本时:
./script space input.txt
(第一个参数是 θ 的值,第二个参数是文件名),输出是字段 12 中的所有值:
$ ./script1 space input1.txt
1.2
3.9
输出应该只是 1.2,我搜索并发现我需要创建一个循环来逐行读取文件,但我无法让它工作。
答案1
您可以在以下位置完成所有工作awk
:
#!/bin/sh
file=$2
awk -v theta="$1" -F '[= ]+' '
$0 ~ theta { print $12; found++ }
END { if (!found) { print "Not available"; exit 1 } }' "$file"
您可能需要添加错误处理来验证是否有两个命令行参数,并且$2
是可读文件的名称,因为
- 如果
$2
不是可读文件,您将收到一条错误消息awk
- 如果
$2
为空或不存在,awk
将从标准输入中静默读取。
(当然,您可能可以接受其中一种或两种行为。)
笔记:
$0 ~ theta
通过更改为 ,您可能会获得更有针对性的结果$8 == theta
。- 中的变量
awk
被初始化为空白。这在数学上下文中被视为 0,因此在第一次执行时found++
设置为 1。found
我故意这样说,found++
而不是found = 1
这样,如果多行匹配theta值,found
将被设置为数字这样的线路。这看起来应该是一个错误条件;如果你担心的话,可以修改该块,如果不是 1,则END
报告错误。found
- 当然,如果您需要脚本在找到值时执行一件事,而在未找到值时执行其他操作,则可以
print
从END
块中删除该语句,并让脚本仅测试awk
退出状态并发出自己的错误消息。如果您想捕获 的输出awk
(即 θ2 值),您也应该这样做。相反,如果您需要的只是人类可读的错误消息,并且不需要能够检查退出状态,则可以exit
从块中删除该语句END
。
答案2
尝试这个:
#! /bin/bash
file=input1.txt
if grep -q $1 "$file";
then
grep $1 $2 | awk -F '[= ]+' '{ print $12 }'
else
echo "Not available"
fi
答案3
看起来你的逻辑可以归结为:
grep -om1 "$1" < "$2" ||
echo 'Not available.'
grep
...无论如何,提供了一个 GNU 。不过,如果是我,我会放弃echo
,或者至少会……
! echo 'Not available.' >&2
...反而。