我有一个包含数百行序列的文本文件,如下所示:
乙 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