【问题标题】:Having issues with shell script conceptshell脚本概念有问题
【发布时间】:2017-07-22 20:27:27
【问题描述】:

您好,我有一个包含以下内容的文件

> 1234 alphabet /vag/one/arun  
> 1454 bigdata /home/two/ogra  
> 5684 apple /vinay/three/dire

但我希望输出像

> 1234 alphabet one  
> 1454 bigdata two  
> 5684 apple three

【问题讨论】:

  • 太棒了。那么你的问题是什么?你尝试过什么?

标签: bash shell command-line


【解决方案1】:
awk '{
  split($NF,ar,"/");
  $NF=ar[3]
  for (i=1;i<=NF;i++) {
    printf "%s ",$i
  }
  printf "\n"
}' filename

取最后一个由空格分隔的字段,并根据“/”将其拆分为数组 ar,最后一个字段等于 ar 中的第三个元素,然后循环打印它们。

【讨论】:

  • 非常感谢先生,但我可以使用嵌套循环(如 while、for 等)来执行此操作吗?您能帮我解决一下吗
  • @ricky:除了 awk 解决方案 一个嵌套循环这一事实之外,我想知道:是什么让你如此喜欢你不喜欢的嵌套循环没有的程序?
【解决方案2】:

将每条输入线切成小块,将不需要的部分扔进废纸篓,然后重新组装剩下的部分。例如:

grep -Eo '(^|/[^/]+/|/[^/]+$|[^/]+)' <INPUTFILE| grep -Fv /|xargs -L 2 -d '\n' echo >OUTPUTFILE

【讨论】:

    【解决方案3】:

    您可以简单地通过控制IFS内部字段分隔符)来做到这一点,当它包含'/' 字符时将导致文件拆分发生,允许您将a/b/c 读入单独的变量。然后只需打印您想要的变量,例如与file中的原始内容,

    $ while IFS="${IFS}/" read -r n l a b c; do echo "$n $l $b"; done < file
    1234 alphabet one
    1454 bigdata two
    5684 apple three
    

    【讨论】:

      猜你喜欢
      • 2011-10-22
      • 1970-01-01
      • 1970-01-01
      • 2011-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-21
      • 2011-07-31
      相关资源
      最近更新 更多