【发布时间】: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
我正在尝试编写一个脚本来编辑文本文件的格式。我得到了一个格式为坐标的文件
x: 123
y: 456
x: 789
y: 012
...
但需要它的形式
123 456 i
789 012 i
...
有点像Edit text format with shell script,反之亦然;)
你们有什么想法我可以做到这一点吗?
【问题讨论】:
标签: bash shell command-line
一个简单的 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。
你可以使用这样的东西:
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
【讨论】:
你可以使用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
【讨论】: