Linux脚本练习之script074-将字段逆序输出文件的每行

script074

题目

注:题目来源于 SHELL17 将字段逆序输出文件的每行

将字段逆序输出文件 nowcoder.txt 的每一行,其中每一字段都是用英文冒号 : 相分隔。假设 nowcoder.txt 内容如下:

nobody:*:-2:-2:Unprivileged User:/var/empty:/usr/bin/false
root:*:0:0:System Administrator:/var/root:/bin/sh

你的脚本应当输出:

/usr/bin/false:/var/empty:Unprivileged User:-2:-2:*:nobody
/bin/sh:/var/root:System Administrator:0:0:*:root

脚本一

原理很简单,就是将每行文本按照冒号字符进行拆分,单独在一行,再利用 tac 命令逆序所有行,最后再将所有的行合并在一行通过冒号字符分隔,注意合并后的文本在末尾多一个冒号字符进行删除掉。

在这里插入图片描述

#!/bin/bash

# 读取文件的每一行
while read line; do 
  # 逆序文件行
  newline=$(echo "${line}" | tr -s ":" "\n" | tac | tr -s "\n" ":")
  # 删除行末尾的字符
  echo "${newline::-1}"
done < nowcoder.txt

注:该程序无法通过网站测试,可能是因为 tac 命令的影响。

脚本二

利用 awk 命令编程完成,实际上是每行按冒号分隔的字段域存储在一个数组中,然后倒序输出数组中的所有值拼接成新行,并通过冒号分隔。

awk -F ":" '{
  # 使用冒号作为分隔符,将每个字段域存储到数组中
  for(i=1;i<=NF;i++){
    arr[i]=$i
  }
  # 声明一个变量,存放逆转后的行文本
  msg=""
  # 注意,这里是逆序遍历数组中的所有元素
  for(j=NF;j>=1;j--){
    # 如果是第一次,则将数组元素直接赋给变量 msg
    if(msg==""){
      msg=arr[j]
    # 如果不是,则需要拼接文本,并使用冒号进行分隔  
    }else{
      msg=msg":"arr[j]
    }
  }
  # 最后打印拼接后的该行文本
  print msg
}' nowcoder.txt

脚本三

本质上是脚本二的变种,简化了代码。

awk -F ':' '{
	for (i = NF; i >= 2; i--) {
		printf("%s:", $i)
	}
	print($1)
}' nowcoder.txt
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值