gpt4 book ai didi

linux - 使用 awk 搜索多个条件字符串

转载 作者:IT王子 更新时间:2023-10-29 00:55:14 24 4
gpt4 key购买 nike

我有一组看起来像这样的数据

col1    col2    col3    col4
ABC1 DEF1 GHI1 cond1
ABC2 DEF2 GHI2 cond1-cond2
ABC3 DEF3 GHI3 cond2/cond1
ABC4 DEF4 GHI4 cond2 cond1
ABC5 DEF5 GHI5 cond4/cond1
ABC6 DEF6 GHI6 cond1
ABC7 DEF7 GHI7 mcond1
ABC8 DEF8 GHI8 cond2
ABC9 DEF9 GHI9 cond1 at 50
ABCa DEFa GHIa con cond1
ABCb DEFb GHIb no. cond1
ABCc DEFc GHIc cond1 something
ABCc DEFc GHIc Mcond1

我正在尝试编写几个命令来根据“col4”分隔数据以获取:

  1. 包含字符串“cond1”的文件,其前后除了“M”和“m”字母之外的任何内容。我目前正在为此使用此命令(显然不排除 M 和 m):

    awk 'BEGIN{IGNORECASE=1} $4 ~ /.cond1/ || $4 ~ /cond1./ ' /filepath.tab

    也请注意第 4、9 和 11 行数据在“cond1”和其他字符串之间包含空格,我希望将其包含在文件中。 (命令中的“.”是否包含空格?)

  2. 我写了一个命令来获取一个仅在“col4”中包含“cond1”的文件

    awk 'BEGIN{IGNORECASE=1} $4 ~ /^cond1$/ '  /filepath.tab

    虽然我在结果中遇到了这 2 个错误,但它对大多数数据都运行良好:

    ABC9    DEF9    GHI9    cond1 at 50
    ABCc DEFc GHIc cond1 something

谁能帮我解决这两个命令?谢谢。

我正在寻找不包含任何重复项的 3 个文件的输出,这是一个示例:File1(包含cond1的所有组合):

col1    col2    col3    col4
ABC2 DEF2 GHI2 cond1-cond2
ABC3 DEF3 GHI3 cond2/cond1
ABC4 DEF4 GHI4 cond2 cond1
ABC5 DEF5 GHI5 cond4/cond1
ABC9 DEF9 GHI9 cond1 at 50
ABCa DEFa GHIa con cond1
ABCb DEFb GHIb no. cond1
ABCc DEFc GHIc cond1 something

文件 2(仅包含 cond1):

col1    col2    col3    col4
ABC1 DEF1 GHI1 cond1
ABC6 DEF6 GHI6 cond1

File3(包含 file1 和 file2 中未包含的任何内容):

col1    col2    col3    col4
ABC7 DEF7 GHI7 mcond1
ABC8 DEF8 GHI8 cond2
ABCc DEFc GHIc Mcond1

注意3个文件的总行数与原文件相同如果这听起来很复杂,我很抱歉,但我确实遇到过这种情况。

最佳答案

问题是第 4 列中有空格并且您的文件没有按预期格式化尝试 awk -F'\t' {print $4} file 并注意它可能不是您期望的。

首先用sed将文件转为CSV格式

$ sed 's/\s\+/,/;s/\s\+/,/;s/\s\+/,/;' file
col1,col2,col3,col4
ABC1,DEF1,GHI1,cond1
ABC2,DEF2,GHI2,cond1-cond2
ABC3,DEF3,GHI3,cond2/cond1
ABC4,DEF4,GHI4,cond2 cond1
ABC5,DEF5,GHI5,cond4/cond1
ABC6,DEF6,GHI6,cond1
ABC7,DEF7,GHI7,mcond1
ABC8,DEF8,GHI8,cond2
ABC9,DEF9,GHI9,cond1 at 50
ABCa,DEFa,GHIa,con cond1
ABCb,DEFb,GHIb,no. cond1
ABCc,DEFc,GHIc,cond1 something
ABCc,DEFc,GHIc,Mcond1

这只会将前 3 个空白组转换为逗号,根据需要保留 col4。要将更改存储在文件中,请使用 -i 选项:

sed -i 's/\s\+/,/;s/\s\+/,/;s/\s\+/,/;' file

现在可以使用字段分隔符,了。

awk 'BEGIN{FS=",";OFS="\t"} NR==1{print $1,$2,$3,$4} $4~/cond1./|| $4~/[^mM]cond1/{print $1,$2,$3,$4}' file
col1 col2 col3 col4
ABC2 DEF2 GHI2 cond1-cond2
ABC3 DEF3 GHI3 cond2/cond1
ABC4 DEF4 GHI4 cond2 cond1
ABC5 DEF5 GHI5 cond4/cond1
ABC9 DEF9 GHI9 cond1 at 50
ABCa DEFa GHIa con cond1
ABCb DEFb GHIb no. cond1
ABCc DEFc GHIc cond1 something

$ awk 'BEGIN{FS=",";OFS="\t"} NR==1{print $1,$2,$3,$4} $4~/^cond1$/{print $1,$2,$3,$4}' file
col1 col2 col3 col4
ABC1 DEF1 GHI1 cond1
ABC6 DEF6 GHI6 cond1

$ awk 'BEGIN{FS=",";OFS="\t"} $4!~/cond1/ || $4~/[Mm]cond1/{print $1,$2,$3,$4}' file
col1 col2 col3 col4
ABC7 DEF7 GHI7 mcond1
ABC8 DEF8 GHI8 cond2
ABCc DEFc GHIc Mcond1

只需重定向以保存新文件 awk '{...}' > file1

关于linux - 使用 awk 搜索多个条件字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14155315/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com