我正在将数据转储到 csv 文件 (my_datum_file.csv) 中。这内容都是逗号分隔的,我想找到最后的第四个参数的实例(即打印的有关 MX3、TMX、MSV 等的数据的最后一个实例)。第 5 个参数是第 4 个参数的“子类”(即 TMX 有 098 和 001)。同样重要的是,第七个参数是“status”而不是“SVlts”。问:我希望将第 10 个值(以分钟为单位的时间段)转换为小时。我想打印这个值。
所以我从终端写道:
$ cat /home/ed/start_up_job/my_datum_file.csv | awk -F, '( $4 == "TMX" ) && ( $5 == "098" ) && ( $7 == "status" ) {print $10/60}' | tail -1`'
最终结果是 1022.25 小时,非常棒;
我已将其嵌入到通用的小 bash 脚本中
#!/bin/bash
machine_ID="$1"
machine_number="$2"
echo "$1 $2 hours is `awk -F, -v MID="$machine_id" -v MNR="$machine_number" '( $4 == MID ) && ( $5 == MNR ) && ( $7 == "status" ) {t=$10} END{print int(t/60)}' /home/ed/start_up_job/my_datum_file.csv`"
所以当我从终端调用 bash 脚本时,$ ./myscript.txt TMX 098
我得到以下输出TMX 098 hours is: 0
我的预期输出是TMX 098 hours is: 1022.25
我不知道出了什么问题?
答案1
替换cat
从终端使用的并awk -F, -v MID="$machine_ID" -v MNR="$machine_number" '( $4 == MID ) && ( $5 == MNR ) && ( $7 == "status" ) {t=$10} END{print int(t/60)}' /home/ed/start_up_job/my_datum_file.csv
工作的。
理解代码:
awk -F
将字段分隔符定义为,
-v
给程序变量赋值MID="$machine_ID"
其中 as是forMID
中新给定的变量名称,它是一个 shell 变量awk
$machine_ID
-v MNR="$machine_number"
类似地,-v
重新分配一个awk
名为 as 的变量,MNR
称为一个 shell 变量$machine_number
( $4 == MID )
4
使第 th 参数与所MID
包含的内容相等&&
和( $5 == MNR )
5
使第 th 参数与所MNR
包含的内容相等&&
和( $7 == "status" )
使7
第 th 参数等于status
{t=$10}
将10
第 th 值赋给t
END
是在读取所有输入后执行一次的规则print int(t/60)
打印输出t/60
(注意前面没有$符号t
)作为int
埃格尔/home/ed/start_up_job/my_datum_file.csv
从文件中~
本质上,在文件中,这段代码查找保存和 的/home/ed/start_up_job/my_datum_file.csv
值。然后代码将第 [$]参数的值放入并在ing by后将其作为eger 保存MID
MNR
10
t
print
int
/
60