2014-01-24 40 views
-1

I/P档有数据如下:while循环在shell脚本偏移

Y 
REQUIRES Z 
A 
REQUIRES B 
C 
REQUIRES D 
REQUIRES E 
REQUIRES F 
G 
REQUIRES H 
I 
REQUIRES J 

精确的输出文件所需:

Y REQUIRES Z 
A REQUIRES B 
C REQUIRES D 
C REQUIRES E 
C REQUIRES F 
G REQUIRES H 
I REQUIRES J 

我使用while循环遍历文件。

while read line 
do 
if (condition) 
{.. 
} 
while read anoterline 
do 
done 
done <inputfile 

我面临的问题是,

  1. 内时while循环遍历说4行和我打破内 环路外while循环的被设置为偏移偏移量,所述 内而已停止。
  2. 所以我缺少执行我的外循环中的4行数据。 我需要外,同时循环从偏移开始在它已经停止

+0

关于“问题” - 文件I/O不能以这种方式工作(没有反向查找,并且因为没有fseek()的接口,所以这里不是一个选项)。这与shell的构建无关,而构建嵌套时的错误行为,以及为您的问题选择合适的流控制构造所做的一切。 –

回答

0

这里没有理由使用嵌套循环。

item= 
while read -r first second _; do 
    if [[ $first = REQUIRES ]]; then 
    printf '%s REQUIRES %s\n' "$item" "$second" 
    else 
    item=$first 
    fi 
done <inputfile 

调用和输出实例

> ./abovescript 
Y REQUIRES Z 
A REQUIRES B 
C REQUIRES D 
C REQUIRES E 
C REQUIRES F 
G REQUIRES H 
I REQUIRES J 
0

喜欢的东西

#!/bin/bash 
while read -r line; do 
    [[ $line =~ ^[A-Z]$ ]] && one="$line" 
    [[ $line =~ ^REQUIRES(.*) ]] && echo "$one $line" 
done < "file" 

你可以用做awk

$ awk 'NF==1{a=$1};NF>1{print a,$0}' file 
Y REQUIRES Z 
A REQUIRES B 
C REQUIRES D 
C REQUIRES E 
C REQUIRES F 
G REQUIRES H 
I REQUIRES J