对于循环多个数组,保留空行

时间:2016-12-18 05:07:08

标签: android arrays bash for-loop awk

我有三个文件:

文件1

one
uno
un
1

文件2

two
dos

2

文件3     三     特雷斯     特鲁瓦     3

这是我的剧本:

#!/system/bin/bash
list=($(cat /sdcard/lst1 )) 
list2=($(cat /sdcard/lst2 ))
list3=($(cat /sdcard/lst3 ))
for i in ${!list[*]} ; do 
echo -e "${list[$i]} ${list2[$i]} 
${list3[$i]} ; done

这是我得到的输出:

one two three
uno dos tres
un   2  trois
 1       3

这里是所需的输出:

one two three
uno dos tres
un      trois
 1   2   3

我也尝试过:

IFS=$'\n' ; set -f ;    

但它仍然无效...

我需要改变什么?

它在Android上,没有paste命令。

2 个答案:

答案 0 :(得分:1)

paste f1 f2 f3

应该完成给你的工作

one two three
uno dos tres
un      trois
1   2   3

编辑:在Android中,默认情况下无法使用粘贴

如果file1,file2,file3是三个文件,那么脚本下面就可以完成这项工作

 awk '{line[FNR]=(line[FNR]=="")?$0:line[FNR] "\t" $0}END{for(i=1;i<=FNR;i++){print line[i]}}' file*

<强>输出

one two three
uno dos tres
un      trois
1   2   3

<强>参考

  1. Awk [ String Concatenation ]
  2. Awk [ For Statement ]

答案 1 :(得分:0)

Bash使用mapfile命令(或其同义词,readarray)将文件读入数组,一次一行。与list=($(cat file))不同,$IFS实际上只是使用mapfile shell变量将整个文件拆分为数组元素(因此删除空行),#!/bin/bash for i in {1..3}; do # Assign file 1 to arr1, file2 to arr2 and file3 to arr3 mapfile -t arr"$i" < file"$i" done # Loop over indices of arr1 for i in "${!arr1[@]}"; do # Print elements number i from each array printf '%s\t%s\t%s\n' "${arr1[i]}" "${arr2[i]}" "${arr3[i]}" done 为数组元素指定一个空行。 / p>

使用Bash,我按如下方式编写:

mapfile

<强>说明:

  • 与普通参数分配不同,-t中的数组名称可以&#34;构建&#34;。
  • printf选项会删除尾随换行符。
  • 我使用printf
  • 而不是not universally portable echo -e
  • 这些特定输入不必引用任何变量,但它不会受到影响 - 特别是在cors: allowed-origins: "*" allowed-methods: GET, PUT, POST, DELETE, OPTIONS allowed-headers: "*" exposed-headers: allow-credentials: true max-age: 1800的参数中。