我试图编写一个需要提取两个版本中存在的详细信息的脚本。
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-A1
和BBC-A1
)
如何使用 awk或sed 或其他任何方式执行此操作?
答案 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
。