首页 > 解决方案 > unix ksh如何打印$1和$2的前n个字符

问题描述

我有一个文件如下:

$ cat /etc/oratab  
hostname01:DBNAME11:/oracle_home/A_19.0.0.0:N
hostname01:DBNAME1_DC:/oracle_home/A_19.0.0.0:N
hostname02:DBNAME21:/oracle_home/B_19.0.0.0:N
hostname02:DBNAME2_DC:/oracle_home/B_19.0.0.0:N

当第三列与字符串“19.0.0”匹配时,我想打印第一列、第二列和第三列的前 6 个字符的唯一性。

我想看到的输出是:

hostname01:DBNAME1:/oracle_home/A_19.0.0.0
hostname02:DBNAME2:/oracle_home/B_19.0.0.0

我把这段代码放在一起,但看起来它不是正确的方法。

cat /etc/oratab|grep "19.0.0"|awk '{print $1}' || awk -F":" '{print subsrt($2,1,8)}

抱歉,我对 shell 脚本很陌生

标签: unixawkprinting

解决方案


第一个解决方案:使用您显示的示例,请尝试使用 GNU 进行以下、编写和测试awk

awk 'BEGIN{FS=OFS=":"} {$2=substr($2,1,7)} !arr[$1,$2]++ && $3~/19\.0\.0/{NF--;print}' Input_file


第二种解决方案:或者,如果您awk不支持NF--尝试以下操作。

awk '
BEGIN{
  FS=OFS=":"
}
{
  $2=substr($2,1,7)
}
!arr[$1,$2]++ && $3~/19\.0\.0/{
  $4=""
  sub(/:$/,"")
  print
}
' Input_file

说明:简单的解释是,将字段分隔符和输出字段分隔符设置为:. 然后在主程序中,将第二个字段设置为其值的第一个 7 个字符。然后检查条件是否是唯一的(以前没有出现过)并且第三个字段类似于 19.0.0,减少 1 个字段并打印该行。


推荐阅读