bash:在数组中使用列分隔

bash:在数组中使用列分隔

是否可以将列单独放在数组中,不是作为一行而是作为一列。我需要按顺序访问这些行。我有一个文件,但在此示例中,文件被分成几列并单独使用。

示例文件:

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

相关内容