unix - 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 脚本很陌生
解决方案
第一个解决方案:使用您显示的示例,请尝试使用 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 个字段并打印该行。
推荐阅读
- java - Point2D Double 不存储双精度
- javascript - 对 php 代码使用更基本的 setInterval
- linux - strace 中的 fstat64 和未完成的读取
- c# - 将 worldVelocity 更新到最新的 Unity 版本
- python - 使用 Unicode 的弹性搜索在 python 中突然出现
- docker - 将烧瓶应用程序部署到 Docker - 路由/重定向问题
- c# - 根据没有状态代码的 XML 响应返回 HTTP 状态代码
- datatables - 在表格中添加可搜索标签
- python - 使用 keras 获得 batch_size>1 不兼容的形状错误
- python - 编写 csv 文件 - Python