bash 脚本读取第一个参数作为输入并在另一个文件中逐行查找变量

bash 脚本读取第一个参数作为输入并在另一个文件中逐行查找变量

我有一个文件“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
  • 当然,如果您需要脚本在找到值时执行一件事,而在未找到值时执行其他操作,则可以printEND块中删除该语句,并让脚本仅测试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

...反而。

相关内容