【问题标题】:Edit Text format (probably with shell script)编辑文本格式(可能使用 shell 脚本)
【发布时间】:2014-09-17 22:26:40
【问题描述】:

我正在尝试编写一个脚本来编辑文本文件的格式。我得到了一个格式为坐标的文件

x: 123
y: 456
x: 789
y: 012
...

但需要它的形式

123 456 i
789 012 i
...

有点像Edit text format with shell script,反之亦然;)

你们有什么想法我可以做到这一点吗?

【问题讨论】:

    标签: bash shell command-line


    【解决方案1】:

    一个简单的 bash 脚本使用计数器在每 2 行读取后切换打印可以满足您的需要。只需将数据文件作为参数 1 传递:

    #!/bin/bash
    
    declare -i cnt=0
    
    while read -r line || [ -n "$line" ]; do
        array+=( ${line##* } )                              # read values into array
        ((cnt++))                                           # increase counter
        if [ "$cnt" -eq 2 ]; then                           # if count = 2
            printf "%s %s i\n" "${array[0]}" "${array[1]}"  # print both array values
            cnt=0                                           # reset count to 0
            unset array                                     # unset array
        fi
    done <"$1"
    

    输出

    123 456 i
    789 012 i
    

    【讨论】:

    • 仅供参考 .. 当您使用 declare -i 时,您也可以在不使用 ((..)) 构造的情况下编写 cnt+=1
    • 现在这是一个很好的学习,已添加到 bash 工具箱中! (井篮文件)
    【解决方案2】:

    你可以使用这样的东西:

    awk 'NR>1&&NR%2{print a[1],a[2],"i";i=0}{a[++i]=$2}END{print a[1],a[2],"i"}' file
    

    数组a 包含前两行的内容。忽略第一行,当行号为奇数时(即NR%2 为 1 时),打印最后两行,后跟“i”。最后,打印最后两行。

    测试一下:

    $ awk 'NR>1&&NR%2{print a[1],a[2],"i";i=0}{a[++i]=$2}END{print a[1],a[2],"i"}' file
    123 456 i
    789 012 i
    

    【讨论】:

      【解决方案3】:

      你可以使用awk:

      $ awk '$1 == "x:"{line=$2}$1 == "y:"{line=line FS $2 FS "i"; print line}' file
      123 456 i
      789 012 i
      

      或者,read 循环:

      while read -ra line; do
          case ${line[0]} in 
              x:)
                  new_line=${line[1]}
                  ;;
              y:)
                  new_line+=" ${line[1]} i"
                  echo $new_line
                  ;;
          esac
      done < file
      

      【讨论】:

        猜你喜欢
        • 2012-08-03
        • 2014-11-29
        • 2016-08-10
        • 1970-01-01
        • 2022-11-29
        • 1970-01-01
        • 1970-01-01
        • 2018-10-12
        • 1970-01-01
        相关资源
        最近更新 更多