我不确定该怎么做。
我有两个文本文件FILE1
和FILE2
。
我想同时为每个文件运行一个for循环并显示 内容彼此相邻。
例如
for $i in $(cat FILE1); do echo $i; done
for $j in $(cat FILE2); do echo $j; done
我想结合这两个命令,因此我可以同时运行两个文件,并获得类似$i $j
答案 0 :(得分:3)
使用paste
命令
paste FILE1 FILE2
如果行数相同,则可以执行此操作。
#!/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兆字节,我不建议您这样做。