linux 如何同时从管道和文件中提供awk输入?

nhn9ugyo  于 12个月前  发布在  Linux
关注(0)|答案(2)|浏览(127)

我想知道如何让awk从管道输出和文件中获取字符串?
我基本上有一个命令链,最终会吐出一个字符串。我想检查这个字符串对一个csv文件(列用逗号分隔).然后,我想找到文件中的第一行,其中包含csv文件第7列中的字符串,并打印出该行第5列的内容.另外,我不太了解Linux命令行实用程序/awk,所以请随意提出完全不同的方法。:)
CSV文件内容如下所示:

col1,col2,col3,col4,col5,etc...
col1,col2,col3,col4,col5,etc...
etc...

字符串
我的总体思路是:

(rest of commands that will give a string) | awk -F ',' 'if($5 == string){print $7;exit}' filename.txt


这可以做到吗?如果是这样,我如何告诉awk与该字符串进行比较?我发现了一些关于在文件名之前使用ARGV[]-符号的东西,但无法使其工作。

rvpgvaaj

rvpgvaaj1#

正如Karoly所说,

str=$( rest of commands that will give a string )
awk -v s="$str" -F, '$7==s {print $5; exit}' file

字符串
如果你想用管子喂awk:

cmds | awk -F, 'NR==FNR {str=$0; next}; $7==str {print $5}' - file


我认为第一种选择更有可读性。

tp5buhyn

tp5buhyn2#

完全跳过temp shell变量:

echo 'BEGIN { OFS = RS } /2023/ { print $2, $3, $4, $5 }' |

x

gawk -f- -b -p- <( gdate )
Dec
26
17:03:17
EST
# gawk profile, created Tue Dec 26 17:03:17 2023

    # BEGIN rule(s)

    BEGIN {
     1      OFS = RS
    }

    # Rule(s)

     1  /2023/ { # 1
     1      print $2, $3, $4, $5
    }

的数据
或者,如果您更喜欢解析语法的副本加上不带分析器的执行:

echo '{ print NR,FNR,NF,ARGV[0], FILENAME, $2, $3, $4, $5 } END { OFS = "\f"
       __ = "argv"; for (_ in PROCINFO[__]) print "\t"_, PROCINFO[__][_] }' |
gtee >( gawk -o- -f- >&2; ) | 
 
gawk -nMb -f- <( gdate )
{
    print NR, FNR, NF, ARGV[0], FILENAME, $2, $3, $4, $5
}

END {
    OFS = "\f"
    __ = "argv"
    for (_ in PROCINFO[__]) {
        print "\t" _, PROCINFO[__][_]
    }
}

相关问题