unix ksh如何打印$1和$2的前n个字符

unix ksh如何打印$1和$2的前n个字符,unix,awk,printing,Unix,Awk,Printing,我的档案如下: $ 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”匹配时,我想打印第一列的唯一字符、

我的档案如下:

$ 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脚本非常陌生。

第一个解决方案:请使用显示的示例尝试以下内容,并使用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个字段并打印该行。

如果行可以类似于此并以
19.0.0

hostname01:DBNAME1:/oracle_home/A_19.0.0.0
hostname01:DBNAME1:/oracle_home/A_19.0.0.1
而且
hostname01
只能是唯一的,您可能会漏掉一行


您可以使用sed来匹配模式,并使用两个您想要保留的捕获组来匹配您不想要的捕获组

然后通过管道将输出传输到
uniq
,以获得所有唯一的行,而不是第一列的行

sed -nE 's/^([^:]+:.{7})[^:]*(:[^:]*19\.0\.0[^:]*).*/\1\2/p' file | uniq
输出

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

您可以尝试此
awk

awk'BEGIN{FS=OFS=“:”}$3~/19\.0\.0/&!见[$1]++{
打印$1,substr($2,1,7),$3}'/etc/fstab
主机名01:DBNAME1:/oracle\u home/A\u 19.0.0.0
主机名02:DBNAME2:/oracle\u home/B\u 19.0.0.0

只有在
$3

中找到
19.0.0
时,我们才检查并填充关联数组
seen

您的意思是“第二列的前7个字符”,而不是“前6个…”,对吗?@code口渴,请告诉我我我的答案是否对您有所帮助?
$ awk 'BEGIN{FS=OFS=":"} index($3,"19.0.0"){print $1, substr($2,1,7), $3}' file | sort -u
hostname01:DBNAME1:/oracle_home/A_19.0.0.0
hostname02:DBNAME2:/oracle_home/B_19.0.0.0