ksh увеличивает аргумент цикла while - PullRequest
0 голосов
/ 30 октября 2018

В 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, вместо того, чтобы печатать три раза «отходы» и последние семь строк второго файла в новый файл, мой Winscp отображает 10-кратный «отход», в то время как запуск сценария.

Ответы [ 2 ]

0 голосов
/ 30 октября 2018

Не вижу, в чем проблема. Возможно, file1 содержит другие символы после 'N', например пробел 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'
0 голосов
/ 30 октября 2018

Предполагая, что в файлах 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

Работает с моими (очень) маленькими тестовыми файлами ...

...