我需要有关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 loop
与two for loop
结合使用,以获得如上所述的输出。
答案 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"