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脚本非常陌生。第一个解决方案:请使用显示的示例尝试以下内容,并使用GNUawk
编写和测试
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