2014-01-24 72 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