bash - 如何将命令行 awk 脚本(带参数)作为 bash 脚本运行?
问题描述
我有一个 awk 脚本(tst.awk):
NR==FNR {
ids[++numIds] = $1","
next
}
FNR==1 { numFiles++ }
{
id = $1
sub(/^[^[:space:]]+[[:space:]]+/,"")
vals[id,numFiles] = $0
gsub(/[^[:space:],]+/,"NA")
naVal[numFiles] = $0
}
END {
for ( idNr=1; idNr<=numIds; idNr++) {
id = ids[idNr]
printf "%s%s", id, OFS
for (fileNr=1; fileNr<=numFiles; fileNr++) {
val = ((id,fileNr) in vals ? vals[id,fileNr] : naVal[fileNr])
printf "%s%s", val, (fileNr<numFiles ? OFS : ORS)
}
}
}
这在命令行上调用:
awk -f tst.awk master file1 file2 file3 > output.file
(注意:可以有可变数量的参数)
如何更改此脚本和命令行代码以将其作为 bash 脚本运行?
我试过(tst_awk.sh):
#!/bin/bash
awk -f "$1" "$2" "$3" "$4"
'NR==FNR {
ids[++numIds] = $1","
next
}
FNR==1 { numFiles++ }
{
id = $1
sub(/^[^[:space:]]+[[:space:]]+/,"")
vals[id,numFiles] = $0
gsub(/[^[:space:],]+/,"NA")
naVal[numFiles] = $0
}
END {
for ( idNr=1; idNr<=numIds; idNr++) {
id = ids[idNr]
printf "%s%s", id, OFS
for (fileNr=1; fileNr<=numFiles; fileNr++) {
val = ((id,fileNr) in vals ? vals[id,fileNr] : naVal[fileNr])
printf "%s%s", val, (fileNr<numFiles ? OFS : ORS)
}
}
}' > output_file
在命令行上调用:
./tst_awk.sh master file1 file2 file3
我也试过(tst_awk2.sh):
#!/bin/bash
awk -f master file1 file2 file3
'NR==FNR {
ids[++numIds] = $1","
next
}
FNR==1 { numFiles++ }
...
}
}
}' > output_file
在命令行上调用:
./tst_awk2.sh
解决方案
-f
后面需要跟awk
脚本的名字。您将 shell 脚本的第一个参数放在它之后。
您可以使用"$@"
来获取所有脚本参数,因此您不仅限于 4 个参数。
#!/bin/bash
awk -f /path/to/tst.awk "$@" > output_file
使用 awk 脚本的绝对路径,以便您可以从任何目录运行 shell 脚本。
如果您不想使用单独的tst.awk
,只需将脚本作为文字的第一个参数awk
.
#!/bin/bash
awk 'NR==FNR {
ids[++numIds] = $1","
next
}
FNR==1 { numFiles++ }
{
id = $1
sub(/^[^[:space:]]+[[:space:]]+/,"")
vals[id,numFiles] = $0
gsub(/[^[:space:],]+/,"NA")
naVal[numFiles] = $0
}
END {
for ( idNr=1; idNr<=numIds; idNr++) {
id = ids[idNr]
printf "%s%s", id, OFS
for (fileNr=1; fileNr<=numFiles; fileNr++) {
val = ((id,fileNr) in vals ? vals[id,fileNr] : naVal[fileNr])
printf "%s%s", val, (fileNr<numFiles ? OFS : ORS)
}
}
}' "$@" > output_file
推荐阅读
- python - 如何在 Python 中解析 MongoDB 的输出
- android - Firebase auth 邮件验证是没用的,因为用户即使不点击确认链接也可以访问应用
- r - 如何在 r 中加速 read_html 运行时?
- android - 发现任务 ':barcode_scan:checkDebugManifest' 的配置有问题
- solidity - 在solidity函数中传递数组数组作为参数
- python - 如何使用 Python 将数组对象(字符串)制作成可行的列表
- r - R中三参数反向威布尔模型实现的最大似然估计
- laravel - 使用 laravel livewire 上传文件时出现错误 422
- numpy - 给定一个 numpy 二维数组的(嵌套)视图,如何检索原始数组的坐标
- javascript - 当条件为真时,如何将 div 位置从水平对齐更改为垂直对齐?