我有这个文件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
.
.
.
等等。
答案 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