awk:如何使用不同的字段分隔符,并对不同的列进行操作

awk:如何使用不同的字段分隔符,并对不同的列进行操作

对于多个文件,我尝试提取包含特定字符串的列,但文件中的字段分隔符不同,并且根据文件的不同,该字符串将显示在不同的列中。

文件 1 中的示例行(分隔符为:):

sss:string1:rrr

文件 2 中的示例行(分隔符为,):

sss,sss,string321,sss,sss

文件 3 中的示例行(分隔符为'):

example'e123'string2'lol

awk我如何使用或其他命令行工具在上述三个文件中查找“字符串” ?

我知道file 1我可以执行:

awk -F: '$2 ~ /string/ {print $2}'

输出将是:

string1

但我想对具有多个分隔符和多个列的多个文件执行此操作,因为每个文件单独会非常耗时吗?可以做吗?

答案1

进行 3 个单独的调用:

awk -F: '{print $2}' file1
awk -F, '{print $3}' file2
awk -F\' '{print $3}' file3

最有可能会像这样快

awk '
    FILENAME == "file1" && FNR == 1 {FS = ":"; col = 2; $0 = $0}
    FILENAME == "file2" && FNR == 1 {FS = ","; col = 3; $0 = $0}
    FILENAME == "file3" && FNR == 1 {FS = "'\''"; col = 3; $0 = $0}
    {print $col}
' file1 file2 file3

当然,前者更容易阅读和维护。

作为Python之禅都说简单胜于复杂。

答案2

如果您想通过一个命令来完成此操作,则以下命令将起作用:

awk -F : '{print $2}' file1 && awk -F : '{print $3}' file2 && awk -F : '{print $3}' file3

这将输出:

string1
string321
string2

如果您只想打印string但不包含任何内容,那么:

awk -F : '{print substr($2,1,6)}' file1 && awk -F , '{print substr($3,1,6)}' file2 && awk -F \' '{print substr($3,1,6)}' file3

解释:

substr($2,1,6)打印第二个字段的从第一个位置开始的子字符串,其中包含 6 个字符string。输出将是

string
string
string

相关内容