编辑文本格式(可能使用shell脚本)

时间:2014-09-17 22:26:41

标签: bash shell command-line

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

形式的文件
x: 123
y: 456
x: 789
y: 012
...

但需要表格

123 456 i
789 012 i
...

有点像Edit text format with shell script,反过来又多一点;)

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

3 个答案:

答案 0 :(得分:1)

使用计数器在读取每2行后切换打印的简单bash脚本可以满足您的需要。只需将数据文件作为参数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

答案 1 :(得分:0)

您可以使用以下内容:

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时),打印最后两行,然后是&#34; i&#34;。最后,打印最后两行。

测试出来:

$ 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

答案 2 :(得分:0)

您可以使用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