使用awk或sed提取两者中的详细信息

时间:2015-04-20 13:54:30

标签: linux bash awk sed

我试图编写一个需要提取两个版本中存在的详细信息的脚本。

ABC-A1   1.0  tomcat                
BBC-A1   2.0  tomcat                           
CAD-A1   1.0  tomcat        
ABC-A1   2.0  tomcat           
BBC-A1   2.0  tomcat

在上面的数据中,我想提取1.0和2.0中存在的名称(ABC-A1BBC-A1

如何使用 awk或sed 或其他任何方式执行此操作?

4 个答案:

答案 0 :(得分:3)

鉴于输入文件只需:

$ awk 'c[$1]++{print $1}' file
ABC-A1
BBC-A1

如果这不足以满足您的实际输入,请更新您的问题以显示更能真实代表您真实问题的输入/输出。

在下面的@jaypals评论中,如果您确实需要检查版本号,请将其修改为:

$ awk '!seen[$1,$2]++ && cnt[$1]++ {print $1}' file
ABC-A1

请注意,这只打印一个输出,因为在发布的样本输入中BBC-A1实际上指定了两次相同的版本号。

答案 1 :(得分:1)

这适用于指定的文本格式,仅适用于版本1.0和2.0

n=0
while IFS=$' \t' read module version tomcat; do
        if echo ${modulesv1[@]} | tr -t ' ' '\n' | grep -q ^$module$ ||
           echo ${modulesv2[@]} | tr -t ' ' '\n' | grep -q ^$module$ ; then
                echo $module has versions 1.0 and 2.0
        fi
        if [[ $version =~ ^1.0$ ]]; then
                modulesv1[$n]=$module
        elif [[ $version =~ ^2.0$ ]]; then
                modulesv2[$n]=$module
        fi
        let n=++n
done < file_with_modules_and_versions

答案 2 :(得分:1)

试试这个awk:

awk '
    {names[$1]=1; ver[$1,$2]=1} 
    END {for (n in names) if (ver[n,"1.0"] && ver[n,"2.0"]) print n}
' file

此管道将输出至少包含2个不同版本(不具体为“1.0”和“2.0”)的名称

awk '{print $1, $2}' file | sort -u | awk '++seen[$1] == 2 {print $1}'

答案 3 :(得分:0)

以下是使用awk的一种方法:

awk '{a[$1];seen[$1,$2]=1}END{for(i in a)if(seen[i,"1.0"]&&seen[i,"2.0"])print i}' file

对于第一列中的所有值,在数组a中设置键。第一列和第二列的组合用于设置seen中的值。具有&#34; 1.0&#34;的名称和&#34; 2.0&#34;文件处理完成后,将打印seen中的条目。

请注意,在您的示例中,您已定义BBC-A1 2.0两次,因此脚本的输出仅为ABC-A1