如何使用bash将数组的所有元素打印到文件中

时间:2015-05-16 02:07:00

标签: arrays bash awk sed

我在一个变量中有一个元素数组。我必须将数组的所有值打印到一个文件中。最初,我使用 sed和cut 从许多文件中读取数组的值。我已将这些值(数组)打印到文件中。当我在循环中使用print语句时,值将被覆盖。有没有其他方法可以使用awk或cat等命令将所有元素打印到文件中 这是我试过的代码

for ((GPCount=0; GPCount< $GPCnt; GPCount++))  
do
G=${GPArr[$GPCount]}
G="$(sed -n '2p' $file.txt|cut -d" " -f7)"
printf "%d\n" "$G" >$out.txt
done

我知道如果我在循环中使用它会覆盖,所以我尝试了另一个代码块

for ((GPCount=0; GPCount< $GPCnt; GPCount++))  
do
$GPArr[$GPCount]="$(sed -n '2p' $file.txt|cut -d" " -f7)"
done
printf "%d\n" "${GPArr[@]}" >$out2.txt

没有输出而且我收到错误(它给出了值,但它无法将sed o / p指向数组变量

./test.sh: line 33: =33: command not found
./test.sh: line 33: =39: command not found
./test.sh: line 33: =45: command not found

如果我像这样修改代码

 for ((GPCount=0; GPCount< $GPCnt; GPCount++))  
 do
 G="$(sed -n '2p' $file.txt|cut -d" " -f7)"
 done
 printf "%d\n" "${GPArr[@]}" >$out2.txt

我在文本文件中输出0作为输出。我需要在我的文本文件中使用这样的o / p

33
39
45

请在这方面帮助我。提前致谢

3 个答案:

答案 0 :(得分:3)

Private Sub UserForm_Initialize()

    ComboBox1.List = Worksheets("Sheet1").Range("A23:A30").Value

End Sub

Private Sub ComboBox1_Change()

    TextBox1.Text = Application.VLookup(ComboBox1.Value, Worksheets("sheet1").Range("A23:B27"), 2, False)

End Sub

printf "%d\n" "$G" >>$out.txt

echo "$G" >>$out.txt 会覆盖整个文件,而>会附加到文件

用法:

>>

答案 1 :(得分:0)

完成任务的最简单方法是使用bash内置printf命令。注意:这是bash内置printf,而不是/usr/bin/printf

for ((GPCount=0; GPCount< $GPCnt; GPCount++))  
do
printf -v GPArr[$GPCount] "%d" $(sed -n '2p' $file.txt|cut -d" " -f7)
done
printf "%d\n" "${GPArr[@]}" >$out2.txt

试一试。

答案 2 :(得分:0)

您的第一个循环失败,因为您似乎尝试将G用作${GPArr[$GPCount]}的别名。 bash变量不会以这种方式工作(尽管在bash 4.3中,您可以声明一个 nameref ,它可以工作:

for ((GPCount=0; GPCount< $GPCnt; GPCount++))  
do
    declare -n G=${GPArr[$GPCount]}
    G="$(sed -n '2p' $file.txt|cut -d" " -f7)"
    printf "%d\n" "$G"
done > "$out.txt"

另外,请确保每次循环都不会覆盖文件$out.txt。 )

你的第二个循环只是一个错字;你不要在变量赋值前加上美元符号。

for ((GPCount=0; GPCount< $GPCnt; GPCount++))  
do
    # Not $GPArr[$GPCOUNT]=...
    GPArr[$GPCount]="$(sed -n '2p' $file.txt|cut -d" " -f7)"
done
printf "%d\n" "${GPArr[@]}" >$out2.txt

顺便说一下,你根本不需要一个循环计数器;您可以使用+=运算符附加到数组。

for ((GPCount=0; GPCount< $GPCnt; GPCount++))  
do
    # Not $GPArr[$GPCOUNT]=...
    GPArr+=("$(sed -n '2p' $file.txt|cut -d" " -f7)")
done
printf "%d\n" "${GPArr[@]}" >$out2.txt

(无论如何,每次通过循环时sed调用如何产生不同的值都不清楚。)