有没有办法在bash脚本中同时读取两个文件?类似于&的使用在编程语言示例中:
for i in $(cat filea.txt) & for j in $(cat fileb.txt)
do
if "$j" = "$i"
then echo "$i"
fi
done
含义:我希望将filea的第1行与fileb的第1行和filea的第2行进行比较,以与fileb的第2行进行比较,依此类推。
答案 0 :(得分:2)
比较线条而不是单词,你可以做些什么,但是:
while read -r -u 3 line1 && read -r -u 4 line2
do
if [ "$line1" = "$line2" ]
then echo "$line2"
fi
done 3<filea.txt 4<fileb.txt
我明确地使用文件描述符3和4来表示对称性(Polya:“尝试对称地对称什么是对称的,并且不要任意破坏任何自然对称性”);它也可能但不太清楚:< / p>
while read -r line1 && read -r -u 3 line2
do
if [ "$line1" = "$line2" ]
then echo "$line2"
fi
done <filea.txt 3<fileb.txt
读取-u代表什么,3和4代表什么?
阅读精细手册 - bash
手册可在线获取,如果您尚未将其加入书签,现在可以将其加入书签。
-u
fd
选项意味着'从指定的文件描述符(示例代码中为3或4)而不是从标准输入(文件描述符0)读取, 当然)。 3和4代表要读取的文件描述符。代码在filea.txt
循环的持续时间内从fileb.txt
重定向文件描述符3,从while
重定向文件描述符4。任何读取文件描述符3的进程都将从filea.txt
获取数据; ditto 4.脚本指示一个read
命令从3读取,另一个从4读取,read
读取行,因此净效果是虽然filea.txt
可以获得数据和fileb.txt
,循环将运行,比较两行和打印。
如果您的目标是打印两个文件之间常见的行,那么使用comm
命令要好得多 - 请参阅Jonas Elfström的answer以获得良好的方法那样做。
假设您的目标是并行读取两个文件中的行,我无法立即想到在bash
中执行此操作的另一种方法。如果您需要并行处理两个文件中的 words (这是for i in $(<filea.txt)
符号所给出的),您可能需要将process substitution与I / O结合使用重定向:
while read -r -u 3 word1 && read -r -u 4 word2
do
if [ "$word1" = "$word2" ]
then echo "$word2"
fi
done 3< <(printf "%s\n" $(<filea.txt)) 4< <(printf "%s\n" $(<fileb.txt))
还有其他方法可以实现这一点,特别是使用tr
而不是printf
,如果文件很大(很多兆字节)会更好。
答案 1 :(得分:1)
如果目标是输出两个文件中相同的行,那么您可以使用comm
comm -12 file1 file2
但如果您确实需要单步执行两个文件,则可以使用文件描述符。
#! /bin/bash
while read -r lineF1 <&3 && read -r lineF2 <&4; do
echo "$lineF1"
echo "$lineF2"
done 3<file1 4<file2