AWK -在哪里搜索AWK程序?



这个问题与AWK程序(带函数)的结构非常相关,该结构是为了响应AWK中使用字符串变量打印列而提供的。

那些回答我最初问题的人帮助我部分理解了所提供的解决方案。我试图将提供的程序写成一行,因为我认为它可以帮助我理解更多,但最终却弄得一团糟。我现在已经采取了解决方案,并在我的bash脚本中添加了一个新函数。

create_selected() {
echo ............creating selected ..............
awk -F "," -v cols=$Columns '
BEGIN {
n=split(cols,Fields,/,/)
}
function _get_cols(i,s){
for(i=1;i<=n;i++) s = length(s) ? s OFS $(Fields[i]) : $(Fields[i])
return s
}
{
print _get_cols()
}' myfile.csv
}

上面的工作很好,但只是部分到达我的对象。我只需要在myfile.csv中返回行内给定字符串的列(由$ columns指定)。该字符串在脚本的其他地方作为$Searchfor捕获。

我认为我必须将这个字符串"传递"给awk,然后/Search/每一行。我的尝试失败了。这可能是由于我缺乏对awk 'BEGIN{} {BODY} END{}'块的理解,或者可能是我对上述解决方案如何工作的理解。也许它只是不允许我搜索以及使用字符串来定义列(?)

我尝试了几个变化,甚至把awk函数移到BEGIN之前,我在网上的例子中看到过。我最初的尝试如下,我认为这是最简单的,但这是我的第一次失败。我能在这个解决方案中使用搜索吗?

create_selected ()
{
echo ............creating selected ..............
awk -F "," -v searched=$Searchfor -v cols=$Columns 'BEGIN{
n=split(cols,Fields,/,/)
}
function _get_cols(i,s){
for(i=1;i<=n;i++) s = length(s) ? s OFS $(Fields[i]) : $(Fields[i])
return s
}
{
/searched/ print _get_cols()
}' myfile.csv
}

结果

............creating selected ..............
awk: cmd. line:9:     /searched/ print _get_cols() 
awk: cmd. line:9:                 ^ syntax error

输入

echo $Columns
1 3 6
echo $Searchfor
dir1
cat myfile.csv
/data/Files/dir1/record_2023-01-11-15-20-00.csv.gz:2023-01-11 15:18:07.634,2023-01-11 15:17:03.683,2023-01-11 15:17:03.763,40,0,5253763,10.106.144.2,34334,157.240.221.34,443,6,281,1,59,1,0,0,0,0
/data/Files/dir2/record_2023-01-11-15-20-00.csv.gz:2023-01-11 15:18:07.634,2023-01-11 15:17:03.683,2023-01-11 15:17:03.763,40,0,5253763,10.106.144.2,34334,157.240.221.34,443,6,281,1,59,1,0,0,0,0
/data/Files/dir3/record_2023-01-11-15-20-00.csv.gz:2023-01-11 15:18:07.634,2023-01-11 15:17:03.683,2023-01-11 15:17:03.763,40,0,5253763,10.106.144.2,34334,157.240.221.34,443,6,281,1,59,1,0,0,0,0

需要输出

/data/Files/dir1/record_2023-01-11-15-20-00.csv.gz:2023-01-11 15:18:07.634 2023-01-11 15:17:03.763 5253763

当前的语法错误是因为你做了{ /searched/ print _get_cols() }而不是/searched/ { print _get_cols() }{ if (/searched/) print _get_cols() },但我认为你想做的是$0 ~ searched { print _get_cols() }index($0,searched) { print _get_cols() }或类似的。

给定您新发布的示例输入/输出,以下是我使用任意awk的方法:

$ cat tst.sh
#!/usr/bin/env bash
create_selected() {
local inFldNrs="$1" tgtDir="$2" file="$3"
echo '............creating selected ..............' >&2
awk -v inFldNrs="$inFldNrs" -v tgtDir="$tgtDir" '
BEGIN {
numOutFlds = split(inFldNrs,out2in)
FS = ","
}
function get_vals(      outFldNr,inFldNr,vals) {
for ( outFldNr=1; outFldNr<=numOutFlds; outFldNr++ ) {
inFldNr = out2in[outFldNr]
vals = (outFldNr == 1 ? "" : vals OFS) $inFldNr
}
return vals
}
{
n = split($1,path,"/")
curDir = path[n-1]
}
curDir == tgtDir {
print get_vals()
}
' "$file"
}
Columns='1 3 6'
Searchfor='dir1'
Infile='myfile.csv'
create_selected "$Columns" "$Searchfor" "$Infile"

$ ./tst.sh
............creating selected ..............
/data/Files/dir1/record_2023-01-11-15-20-00.csv.gz:2023-01-11 15:18:07.634 2023-01-11 15:17:03.763 5253763

最新更新