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