ksh增加while循环参数

时间:2018-10-30 16:48:19

标签: shell unix ksh

在Ksh中,我有一个while循环,可以读取2个文件。如果文件1的当前行为“ Y”,则将文件2的当前行回显到新文件中,如果文件1的当前行为“ N”,则在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,则在打印3次“浪费”并将第二个文件的后7行打印到新文件中时,我的Winscp将显示10倍“浪费”,而运行脚本。

2 个答案:

答案 0 :(得分:0)

假设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

处理我的(非常)小的测试文件...

答案 1 :(得分:0)

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

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

paste -d'#' file1 file2

也许您在应该以{{1​​}}开头的行上看到了一些奇怪的东西。 现在,您可以将N#用于sed的打印行或p写入文件。

w