Linux shell 学习笔记(五)

题目:给定任意以逗号分隔的文本,请输出去掉第二列之后的结果,例如:

zero
file,12,one
disk,2,two
kind,300,tree

Dog,4

输出结果如下:

zero
file,one
disk,two
kind,tree

Dog

一看到这个问题,第一时间想到的是awk,遍历每一行,然后把第二个变量去掉之后,再拼接上第三个变量,实现了一下,结果如下:

########################
# Date: 2017-03-10
# Version:  v1.0 
# Author:   lizp
# Usage:  strsplit
########################
if [ -z $1 ]
then
  echo "input format wrong,eg : strsplit.sh ."
else
  cat $1 | awk -F ',' '{print $1,$3}' | while read var1 var3
  do
  if [ -n "$var1" ]
  then
    result=$var1
    if [ -n "$var3" ]
    then
      result+=","
      result+=$var3
    fi
  fi
  echo $result
  done
fi

结果执行完了,与示例所给的一致,然而,这种方式得到的结果,只会输出前三个变量,后面的变量则不会输出了,所以这样实现是有问题的。

后来,我换了个思路,为什么要从行的角度去处理这个问题呢,shell中难道没有类似UE中Alt+c的列编辑模式吗?

经过查询,我发现了cut命令,于是问题一行代码迎刃而解:

####################
# Date: 2017-03-10
# Version:  v1.0 
# Author:   lizp_billing
# Usage:  strsplit
####################

#去掉第二列
cut -f2 --complement -d"," $1

cut命令可以从列的角度去处理文本,这样一来,这个问题瞬间变得简单了,"f"后面跟要提取的字段,如果有“--complement”则表示提取非N列之外的的数据,此处的N指"f"后面跟的列数。

原文地址:https://www.cnblogs.com/lzp666/p/6568383.html