将行更改为特定顺序

时间:2014-03-16 05:43:50

标签: bash sed awk row

我有这个文件data.txt:

 value1
 value2
 value3
 A
 value4
 value5
 value6
 B
 value7
 value8
 value9
 C
 .
 .
 .

如何在bash中创建此输出:

 A
 value1
 value2
 value3
 B
 value4
 value5
 value6
 C
 value7
 value8
 value9
 .
 .
 .

更改字母的位置,文件扩展为Z,所有值都是不同的。

编辑:  这是一个真实数据的bin,real_input.txt:

 1.688390 2.089450 2.499110
 1.931510 2.840060 1.269530
 2.002690 0.698842 3.072450
 1.612190 0.748615 1.891070
 1.344360 1.131220 0.599143
 1.804060 0.953536 1.510170
 0.597634 2.260670 1.140460
 E = -1173.43219915
 1.673696 2.069325 2.475855
 1.912555 2.814333 1.257740
 1.985098 0.693024 3.043875
 1.584818 0.751690 1.867771
 1.294662 1.088698 0.575066
 1.774873 0.934282 1.501254
 0.604104 2.229057 1.124296
 E = -1173.43450443
 1.650579 2.040808 2.440887
 1.885902 2.775145 1.239654
 1.957682 0.683252 3.002345
 1.534811 0.761264 1.827162
 1.199689 1.007516 0.529033
 1.721899 0.898366 1.489224
 0.619975 2.172922 1.095319
 E = -1173.43870135
 .
 .
 .

等等。

6 个答案:

答案 0 :(得分:7)

如果标签之间总共有3行(4组),请尝试:

sed -n 'N;N;h;n;p;g;p' file

对于变量解决方案,您可以尝试:

awk '!(NR%n){print $0 p; p=x; next}{p=p ORS $0}' n=4 file

答案 1 :(得分:2)

这可能适合你(GNU sed):

sed -r ':a;$!{N;s/^(.*)\n(\s*[A-Z])$/\2\n\1/;Ta}' file

直到它遇到一个标记,然后重新排列线条,将它们打印出来等等。

替代方案:

sed '/^\s*[A-Z]$/!{H;b};G;s/\n//p;z;x;z' file

答案 2 :(得分:1)

如果 awk 可以接受,那么这应该有效:

awk '
!/=/ { line[++cnt]=$0; next }
{ print $0
  for(i=1;i<=cnt;i++) {
      print line[i]
  }
  cnt=0; delete line
}' file

gnu-sed 解决方案:

sed -n '/=/!{H;b};p;s/.*//;x;s/\n//;p' file

答案 3 :(得分:1)

for i in $(cat value)
do
  if [[ $(echo $i | grep -v '^[0-9]*$' | wc -l) == 1 ]]
  then
     echo "$i$x" | tr '#' '\n'
     x=""
  else 
     x="$x#$i"
  fi
done

答案 4 :(得分:1)

您可以使用全BASH解决方案。

while read -r line; do
    if [[ $line != [A-Z] ]]; then
        str+=("$line")
    else
        echo "$line"
        printf "%s\n" "${str[@]}"
        str=()
    fi
done < data.txt

答案 5 :(得分:1)

这是我根据OP的测试说明制作的输入文件。

$ cat file
121413232
12321313
123123213
3423
E=-1173.45
23234324
24534545
23423424
B=323.332
43324
234234254
4354543
X=-2323.23

使用gnu sed(无需修复行号)

sed -r ':a;$!{N;s/(.*)\n([^0-9].*)/\2\n\1/;Ta}' file