爱死你了 发表于 2018-8-26 06:32:53

shell 小脚本

  使用awk命令将如下两份文件中名字相同的两行合并起来
  A文件:
  韩海林 21岁
  海林韩 23岁
  韩林海 22岁
  林海韩 24岁
  B文件:
  韩林海 男
  海林韩 男
  韩海林 男
  林海韩 男
  输出效果:
  韩海林 21岁 男
  _________________________________________________
  #! /bin/bash
  A=`sed s/[[:space:]]/:/g A`
  B=`sed s/[[:space:]]/:/g B`
  for i in$A
  do
  getname=`echo $i | awk -F ':' '{print $1}'`
  if [ "$getname" == "韩海林" ]
  then
  AM=$getname
  AM1=`echo $i | awk -F ':' '{print $2}'`
  fi
  done
  for j in $B
  do
  getbname=`echo $j | awk -F ':' '{print $1}'`
  if [ "$getbname" == "韩海林" ]
  then
  BM=`echo $j | awk -F ':' '{print $2}'`
  fi
  done
  echo $AM $AM1 $BM
  -----------------------------------------------------
  #! /bin/bash
  `sort -n /tmp/A | awk '{print $1}' | uniq > /tmp/id.txt`

  for>  do
  echo "$id"

  awk -v>  done
  -----------------------------------------------------
  awk 中使用外部shell变量
  如:
  A=44
  echo "ABCD" | awk -v GET_A=$A ’{print GET_A}’
  说明:-v选项用于定义参数,这里表示将变量A的值赋予GET_A。有多少个变量需要赋值,就需要多少个-v选项。与之等价的:
  应用于脚本中:
  #! /bin/bash
  sort -n filename |awk -F ':' '{print $1}'|uniq >id.txt

  for>  echo "[$id]"

  awk -v>  done
  附件:
  cat filename
  1111111:13443253456
  2222222:13211222122
  1111111:13643543544
  3333333:12341243123
  2222222:12123123123
  运行脚本后结果为:
  
  13443253456
  13643543544
  
  13211222122
  12123123123
  
  12341243123
  ----------------------------------------------------------
  NR,表示awk开始执行程序后所读取的数据行数.
  FNR,与NR功用类似,不同的是awk每打开一个新文件,FNR便从0重新累计.
  下面看两个例子:
  1,对于单个文件NR 和FNR 的 输出结果一样的 :
  # awk '{print NR,$0}' file1
  1 a b c d
  2 a b d c
  3 a c b d
  #awk '{print FNR,$0}' file1
  1 a b c d
  2 a b d c
  3 a c b d
  2,但是对于多个文件 (NR对两个文件的操作是一直不断增加)
  # awk '{print NR,$0}' file1 file2
  1 a b c d
  2 a b d c
  3 a c b d
  4 aa bb cc dd
  5 aa bb dd cc
  6 aa cc bb dd
  # awk '{print FNR,$0}' file1 file2(FNR是每个文件重新读取的行号)
  1 a b c d
  2 a b d c
  3 a c b d
  1 aa bb cc dd
  2 aa bb dd cc
  3 aa cc bb dd
  在看一个例子关于NR和FNR的典型应用:
  案例一、现在有两个文件格式如下:
  #cat account
  张三|000001
  李四|000002
  #cat cdr
  000001|10
  000001|20
  000002|30
  000002|15
  想要得到的结果是将用户名,帐号和金额在同一行打印出来,如下:
  张三|000001|10
  张三|000001|20
  李四|000002|30
  李四|000002|15
  执行如下代码
  #awk -F \| 'NR==FNR{a[$2]=$0;next}{print a[$1]"|"$2}' account cdr
  注释:
  由NR==FNR为真时,判断当前读入的是第一个文件account,然后使用{a[$2]=$0;next}循环将account文件的每行记录都存入数组a,并使用$2第2个字段作为下标引用.
  由NR==FNR为假时,判断当前读入了第二个文件cdr,然后跳过{a[$2]=$0;next},对第二个文件cdr的每一行都无条件执行{print a[$1]"|"$2},此时变量$1为第二个文件的第一个字段,与读入第一个文件时,采用第一个文件第二个字段$2为数组下标相同.因此可以在此使用a[$1]引用数组。
  案例二、我有这样的需求,需要把两个文件中,第一列相同的行合并到同一行中。举个例子,有两个文件,内容如下
  cat 1.txt
  1 aa
  2 bb
  3 ee
  4 ss
  cat 2.txt
  1 ab
  2 cd
  3 ad
  4 bd
  5 de
  合并后的结果为:
  1 ab aa
  2 cd bb
  3 ad ee
  4 bd ss
  5 de
  实现的命令为:
  awk 'NR==FNR{a[$1]=$2}NR>FNR{print $0,a[$1]}'1.txt2.txt
  -------------------------------------------------------------------------
  sed在文件中某一行最后添加一个数字
  sed 's/\(^a.*\)/\1 12/' test
  #cattest
  askdj
  aslkd aslkdjf3e
  skdjfsdfj
  sdkfjk
  fsdkfjksdjfkjsdf
  12sdfesdf
  aslkdjfkasdjf asdlfkjaskdfj
  #sed 's/\(^a.*\)/\1 12/' test
  askdj 12
  aslkd aslkdjf3e12
  skdjfsdfj
  sdkfjk
  fsdkfjksdjfkjsdf
  12sdfesdf
  aslkdjfkasdjf asdlfkjaskdfj12
  ------------------------------------------------------------------------
  sed中,使用\u表示大写,\l表示小写
  1. 把每个单词的第一个小写字母变大写:
  sed 's/\b/\u&/g' filename
  2. 把所有小写变大写:
  sed 's//\u&/g' filename
  3. 大写变小写:
  sed 's//\l&/g' filename
  ------------------------------------------------------------------------
  有一份电话薄文本文件file.txt,格式如下
  BILL 13800000000
  TOM 13800000001
  ABLE 13800000000
  TOM 13800000003
  要求:人名和电话均可能重复(多对多),找到出现次数最多的电话号码,并列出对于的所以人名。
  #! /bin/bash
  tel=`cat file.txt | awk '{print $2}' | sort -n | uniq | head -1`
  echo $tel
  cat file.txt | awk '{if($2=="13800000000")print $1}'

页: [1]
查看完整版本: shell 小脚本