ksh 递增 while 循环参数

ksh increment the while loop argument

在 Ksh 中,我有一个读取 2 个文件的 while 循环。如果文件 1 的当前行是 "Y" 则将文件 2 的当前行回显到新文件中,如果文件 1 的当前行是 "N" echo "waste" in winscp.

    while IFS= read xxxx && IFS= read yyyy <&4; do
if [[ ${xxxx} = "N" ]];then
      echo waste
   else
      echo "$yyyy" .>> $newfile
   fi
done <"$file1" 4<"$file2"

但是如果文件 1 的前三行为 N,其余七行为 Y,而不是打印三次 "waste" 并将第二个文件的最后七行打印到新文件中,我的 Winscp 显示 10 次"waste" 而 运行 脚本。

假设 file1 和 file2 中的行数相同,并且 file1 的每一行都是 N 或 Y,您可以使用类似的东西:

    #!/bin/ksh

    testArray=($(cat file1.txt))

    i=0

    while read line; do
        if [[ ${testArray[$i]} == "N" ]]; then
            print "waste"
        else
            print $line >> file3.txt
        fi
        ((i++))
    done < file2.txt

或关注评论

    #!/bin/ksh


    while read -r -u 3 line1 && read -r -u 4 line2; do
            if [[ $line1 == "N" ]]; then
                    print "waste"
            else
                    print $line2 >> file3.txt
            fi
    done 3<file1.txt 4<file2.txt

适用于我的(非常)小的测试文件...

我看不出是什么问题。也许 file1 在 'N' 之后还有其他字符,例如 space N、其他字符 NO\r(Windows 文件)。或者小写n.

另一个解决方案可能是使用 paste。查找不在 file1 中的字符(例如 #),并使用该字符将两个文件粘贴在一起。
并用 10 行而不是十亿行测试解决方案(对其他答案的评论)。

paste -d'#' file1 file2

也许您在应该以 N# 开头的行中看到了一些奇怪的东西。 现在您可以使用 sed 打印 p 行或 w 写入文件。

paste -d'#' file1 file2 | sed -n 's/^N#.*/waste/p;s/^[^#]*#//w newfile'