将两个文件读入 IFS while 循环——在这种情况下有没有办法获得零差异结果?

将两个文件读入 IFS while 循环——在这种情况下有没有办法获得零差异结果?

我有一个包含数百行序列的文本文件,如下所示:

    乙 29.
    乙52。
    约84.
    约83.
    约94.
    约93.
    约61.
    乙 38.
    约81.
    约92.
    约28.
    c 37.
    约27.

    lara@batcuter:~/.asd/a-new-way-of-stuying-go$ wc -l game7
    第271章 游戏7

下面的脚本将一个文本文件分成两个文件,其中一个由奇数行组成,另一个由偶数行组成,然后将这两个文件读入 while IFS 循环,在每个文件中打印一行一次:

#/bin/bash
#testing liquor-where-twin-twas-born

awk '{print>"line-"NR%2}' $@

while IFS= read -r lineA && IFS= read -r lineB <&3; do
  echo "$lineA";
  echo "$lineB" 
done <line-1 3<line-0

不幸的是,由于一个文件比另一个文件长一行,因此给出的内容与输入文件不完全相同。

    lara@batcuter:~/.asd/a-new-way-of-stuying-go$testing-liquor game7 > 测试
    lara@batcuter:~/.asd/a-new-way-of-stuying-go$ diff 测试游戏7
    270a271
    > b 7.

显然,由于该文件有 271 行长,因此将其一分为二会产生两个文件,其中一个文件有 136 行,另一个文件有 135 行。我需要修复 IFS while 循环以返回零差异。起初,我认为使用read ... || read ...会有帮助。但实际上,这只是使输出变得臃肿,在每个条目之间插入多个换行符,并删除最后一行(以奇数行数结束在文件中的行),就像我的所有其他解决方案一样尝试过。

答案1

告诉建议的人||他是个白痴。使用||使代码片段首先读取 中的所有行fileA,然后读取 中的所有行fileB,因为只要read lineA返回 true,read lineB就不会执行。相反,调用read两次,保存返回状态,然后测试返回状态。

while
    IFS= read -r lineA; statusA=$?
    IFS= read -r lineB; statusB=$?
    [ $statusA -eq 0 ] || [ $statusB -eq 0 ]
do …

如果您需要知道文件是否已用完,您可以继续测试$statusA并在循环内部(该行内容将为空,但这与空行无法区分)。$statusB

相关内容