如何将命令行awk脚本(带参数)作为bash脚本运行?

如何将命令行awk脚本(带参数)作为bash脚本运行?,bash,awk,Bash,Awk,我有一个awk脚本(tst.awk): (注意:参数的数量可以是可变的) 如何更改此脚本和命令行代码以将其作为bash脚本运行 我试过(tst_awk.sh): 我也尝试过(tst_awk2.sh): 通过以下命令行调用: awk -f tst.awk master file1 file2 file3 > output.file ./tst_awk.sh master file1 file2 file3 /tst_awk2.sh-f后面需要跟一个awk脚本的名称。您正在将shell脚本

我有一个awk脚本(tst.awk):

(注意:参数的数量可以是可变的)

如何更改此脚本和命令行代码以将其作为bash脚本运行

我试过(tst_awk.sh):

我也尝试过(tst_awk2.sh):

通过以下命令行调用:

awk -f tst.awk master file1 file2 file3 > output.file
./tst_awk.sh master file1 file2 file3

/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
#/bin/bash
awk'NR==FNR{
ids[++numIds]=1美元“
下一个
}
FNR==1{numFiles++}
{
id=$1
子(/^[^[:space:]+[:space:]+/,“”)
VAL[id,numFiles]=0美元
gsub(/[^[:空格:,]+/,“NA”)
海军[numFiles]=0美元
}
结束{

for(idNr=1;idNr
-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
!/bin/bash
awk'NR==FNR{
ids[++numIds]=1美元“
下一个
}
FNR==1{numFiles++}
{
id=$1
子(/^[^[:space:]+[:space:]+/,“”)
VAL[id,numFiles]=0美元
gsub(/[^[:空格:,]+/,“NA”)
海军[numFiles]=0美元
}
结束{

对于(idNr=1;idNr,您可以通过添加shebang使
awk
脚本可执行

#! /bin/awk -f

NR==FNR {
   ids[++numIds] = $1","
   next
}...
别忘了
chmod+x tst.awk


通过添加shebang,可以使
awk
脚本可执行

#! /bin/awk -f

NR==FNR {
   ids[++numIds] = $1","
   next
}...
别忘了
chmod+x tst.awk


使用
awk'…'主文件1文件2文件3>输出.文件
(将
..
替换为
tst.awk中的awk脚本
)使用
awk'…'主文件1文件2文件3>输出.文件
(将
..
替换为
tst.awk中的awk脚本
)非常好!感谢您提供了更多信息。第一次看到“$”。非常好!感谢您提供更多信息。第一次看到“$@”。请参阅了解为什么不这样做的一些原因。请参阅了解为什么不这样做的一些原因。
$ ./tst.awk  master file1 file2 file3 > outfile