是否有类似于逻辑AND的东西可以在bash脚本中使用?

时间:2013-08-07 06:33:55

标签: bash

有没有办法在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行进行比较,依此类推。

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ömanswer以获得良好的方法那样做。

假设您的目标是并行读取两个文件中的,我无法立即想到在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