while循环使用嵌套for循环

时间:2014-05-07 10:00:39

标签: bash

我需要有关bash脚本的帮助。 所以我输入数据为

CellIden="461"
CellIden="465"
CellIden="468"
CellIden="462"
CellIden="466"
CellIden="469"
CellIden="463"
CellIden="467"
CellIden="460"

我创建了while循环

cat FolderCell2 | while read line ;
do
echo $line | sed -e 's/cellIden/Cell/g'
done > FolderCell3

所以这将读取每一行并替换字符串,但在脚本中我还需要两个循环:

for (( i = 1; i <=$SEC_NUM ; i++ ))
do
for (( j = 1 ; j <=$Cell_Num ; j++ ))
do
sed -e 's/Cell/Cell$i$j/g'
done
done > File

ouput shold就像这样

Cell11="461"
Cell12="465"
Cell13="468"
Cell21="462"
Cell22="466"
Cell23="469"
Cell31="463"
Cell32="467"
Cell33="460"

变量$ SEC_NUM和$ Cell_Num有时会有所不同。因此,我不知道如何将这两个代码while looptwo for loop结合使用,以获得如上所述的输出。

5 个答案:

答案 0 :(得分:2)

逐行解析时,发现使用AWK脚本更方便。

请考虑以下代码:

#!/bin/awk

BEGIN{
        i=1;
        j=1;
}

{
        split($0,arr,"\"");
        print "Cell" i j "=\"" arr[2] "\""
        j++;
        if (j > CELL_NUM){
                j=1;
                i++;
        }
        if (i > SEC_NUM){
                i=1;
        }
}

END{

}

然后假设脚本是test.awk并且输入文件是1.txt,以这种方式运行:

awk -vCELL_NUM=3 -vSEC_NUM=3 -f test.awk 1.txt

获得您想要的输出:

Cell11="461"
Cell12="465"
Cell13="468"
Cell21="462"
Cell22="466"
Cell23="469"
Cell31="463"
Cell32="467"
Cell33="460"

答案 1 :(得分:1)

这样的事情应该有效:

i=1
while read -r line;
do
    j=1
    sed "s/CellIden=/Cell$i$j=/" <<< "$line"
    for ((j=2; j<=$Cell_Num; j++)); do
        read -r line
        sed "s/CellIden=/Cell$i$j=/" <<< "$line"
    done
    ((i++))
done < FolderCell2 > file.out

答案 2 :(得分:1)

解决方案:

SEC_NUM=3
CellNum=3

i=0
j=0

while read line ; do
  echo  "${line/CellIden/Cell$((i+1))$((j+1))}"
  ((j=(j+1)%CellNum))
  [ $j -eq 0 ] && ((i=(i+1)%SEC_NUM))
done < "$infile" > "$outfile"

变量j将在每个循环周期中递增。 变量i将在每个SEC_NUM个循环中递增。 替换是通过参数替换来完成的以避免 SED。

对于

SEC_NUM=3
CellNum=4

输出

Cell11="461"
Cell12="465"
Cell13="468"
Cell14="462"
Cell21="466"
Cell22="469"
Cell23="463"
Cell24="467"
Cell31="460"

答案 3 :(得分:1)

另一种方法:

i=0
while read -r line;
do
    j=$(bc <<< "obase=$Cell_Num; $i" | xargs printf "%02d" | tr '[0-8]' '[1-9]')
    sed "s/CellIden=/Cell$j=/" <<< "$line"
    ((i++))
done < FolderCell2 > file.out

实际上,用基数3($ Cell_Num)编码数字,
然后用前导零打印。
最后,由于你的编号从1开始,而不是0,用1-9替换所有0-8。

答案 4 :(得分:1)

这是将1D阵列数据转换为2D阵列的东西。实际上只需要(SEC_NUM或Cell_Num)中的一个。

awk -v SEC_NUM=3 '{i=(NR-1)%SEC_NUM+1;j=int((NR-1)/SEC_NUM)+1;sub(/CellIden/,"Cell" j i)}1' file

Cell11="461"
Cell12="465"
Cell13="468"
Cell21="462"
Cell22="466"
Cell23="469"
Cell31="463"
Cell32="467"
Cell33="460"

awk -v SEC_NUM=4 '{i=(NR-1)%SEC_NUM+1;j=int((NR-1)/SEC_NUM)+1;sub(/CellIden/,"Cell" j i)}1' file
Cell11="461"
Cell12="465"
Cell13="468"
Cell14="462"
Cell21="466"
Cell22="469"
Cell23="463"
Cell24="467"
Cell31="460"