是否可以将列单独放在数组中,不是作为一行而是作为一列。我需要按顺序访问这些行。我有一个文件,但在此示例中,文件被分成几列并单独使用。
示例文件:
column1 column2 column3
444 999 000
555 888 xxx
666 777 xxx
输出文件:
output is 444 bla 999 bla 000
output is 555 bla 888 bla xxx
output is 666 bla 777 bla xxx
我尝试了以下 bash:
readarray -t column <firstcolumn.txt
for i in "${column1[@]}"; do
readarray -t column2 <secondcolumn.txt
for j in "${column2[@]}"; do
readarray -t column3 <thirdcolumn.txt
for k in "${column3[@]}"; do
echo "output is $i bla $j bla $k"
done
done
done
答案1
这是一个简单的脚本,应该可以展示 的使用readarray
。我尽量让它与您发布的脚本更相似。
#!/bin/bash
awk '{ print $1 }' data.txt > file_column1.txt
awk '{ print $2 }' data.txt > file_column2.txt
awk '{ print $3 }' data.txt > file_column3.txt
# NLines=` wc -l data.txt | awk '{print $1}'`
readarray -t column1 < file_column1.txt
readarray -t column2 < file_column2.txt
readarray -t column3 < file_column3.txt
i=0;
for item in "${column1[@]}"; do
echo output is ${column1[$i]} bla ${column2[$i]} bla ${column3[$i]};
let "i=i+1"
done
# rm -f file_column1.txt file_column2.txt file_column3.txt
评论:
- 您
awk
可以打印所需的列($1
第一列、$2
第二列等等)。您可以为每一列创建一个不同的文件。 - 如果取消注释,该行
#Nlines=wc -l | awk '{print $1}'
可用于计算在使用之后创建的向量的行数readarray
,并以不同的方式执行循环...... - 读取
readarray
单个文件并输入一维向量。 - 对 1D 向量 column1 的每个分量进行循环
for
。应该对每个向量进行循环,因为在您的示例中,它们的大小都相同。应该使用 进行循环Nlines
。 - 在里面不曾用过循环内的变量
item
始终具有相同的 column1[i] 值 - 您访问直接地您想要的数组组件。(第一个索引是
0
,最后一个是Nlines-1
) i
在循环的每次迭代中增加的值for
。- 如果需要,请取消注释以删除脚本中创建的临时文件。
输出为
output is 444 bla 999 bla 000
output is 555 bla 888 bla xxx
output is 666 bla 777 bla xxx
最后评论
如果你嵌套 3 个循环(一个在另一个里面),你将获得每个排列:不是 3 而是 3*3*3=27 行
0 0 0
0 0 1
0 0 2
0 1 0
...
答案2
为什么不将数组的加载与打印操作分开呢?
readarray -t column1 <column1.txt
readarray -t column2 <column2.txt
readarray -t column3 <column3.txt
for (( i=0; i<${#column1[@]}; i++ )); do
echo -e "output is ${column1[$i]} bla ${column2[$i]} bla ${column3[$i]}"
done
答案3
我不确定我是否理解了你的问题,你似乎在要求一件事,但你的输出却显示另一件事。要获得所需的输出,你只需要
while read col1 col2 col3; do
echo "output is $col1 bla $col2 bla $col3"
done < file
或者,跳过标题:
tail -n +2 file | while read col1 col2 col3; do
echo "output is $col1 bla $col2 bla $col3";
done
如果你确实需要它们在一个数组中,尝试类似
i=0;
while read col1 col2 col3; do
col1s[$i]=$col1;
col2s[$i]=$col2;
col3s[$i]=$col3;
let i++;
done < <(tail -n +2 file);
k=0;
for(( k=0; k<i; k++ )); do
echo "output is ${col1s[$k]} blah ${col2s[$k]} blah ${col3s[$k]}";
done