Bash:一次有两个for循环?

时间:2018-08-18 05:18:15

标签: linux bash shell ubuntu for-loop

我不确定该怎么做。

我有两个文本文件FILE1FILE2

我想同时为每个文件运行一个for循环并显示 内容彼此相邻。

例如

for $i in $(cat FILE1); do echo $i; done

for $j in $(cat FILE2); do echo $j; done

我想结合这两个命令,因此我可以同时运行两个文件,并获得类似$i $j

的输出。

4 个答案:

答案 0 :(得分:3)

解决方案1 ​​

使用paste命令

paste FILE1 FILE2

Details for paste command

Another resource

解决方案2

如果行数相同,则可以执行此操作。

#!/bin/bash
t=$(cat FILE1 | wc -l)
for i in `seq 1 $t`;
do
    cat FILE1|head -n $i|tail -n 1
    cat FILE2|head -n $i|tail -n 1
done

您可以将其扩展为所需的行数不等。

答案 1 :(得分:3)

您根本不应该使用for循环;参见Bash FAQ 001。而是在单个read循环中使用两个while命令。

while IFS= read -r line1 && IFS= read -r line2 <&3; do
  printf '%s | %s\n' "$line1" "$line2"
done < FILE1 3< FILE2

每个read命令从一个单独的文件描述符中读取。在此版本中,当两个文件中的较短文件用完时,循环将退出。

答案 2 :(得分:0)

这里要问两个不同的问题。其他答案解决了如何在两列中显示文件内容的问题。通过同时异步运行两个循环,可以同时运行两个循环(这是解决第一个问题的错误方法):for i in ${seqi?}; do ${cmdi?}; done & for j in ${seqj?}; do ${cmdj?}; done & wait

尽管您也可以使用以下方式实现paste -d ' ' file1 file2

while read line_from_file1; p=$?; read line_from_file2 <&3 || test "$p" = 0; do
    echo "$line_from_file1" "$line_from_file2"
done < file1 3< file2

答案 3 :(得分:0)

bash v4 +中的另一个选项是将两个文件读入2个数组,然后并排回显数组元素:

# Load each file into its own array
readarray -t f1 < file1
readarray -t f2 < file2

# Print elements of both arrays side-by-side
for ((i=0;i<${#f1[@]};i++)) ; do echo ${f1[i]} ${f2[i]}; done

或者如果您希望各列对齐,则将echo更改为printf

printf "%-20s %-20s\n" ${f1[i]} ${f2[i]}

如果文件大小为100兆字节,我不建议您这样做。