Как перемежать два txt файла с альтернативным количеством строк

Чтобы получить все имена файлов, вы должны полагаться на пустые удаленные строки:

find /your/path/ -print0 | while read -r -d $'\0' filename; do
    dn="`dirname "$filename"`"
    bn="`basename "$filename"`"
    bn_clean="`echo "$bn" | tr " \~()&'" "_______"`"
    file_clean="$dn/$bn_clean"
    if [ "$filename" != "$file_clean" ] ; then
        mv -fv "$filename" "$file_clean"
    fi
done
4
23.08.2017, 17:53
3 ответа
$ awk '{print} (FNR % 3)==0{getline<"file2.txt"; print}' file1.txt
1
2
3
A
4
5
6
B

Как это работает

  • print

    Печатает каждый строка из файла1.txt.

  • (FNR % 3)==0{ getline <"file2.txt"; print}

    В каждой третьей строке печатается строка из файла file2.txt.

Альтернатива

Некоторые люди категорически против использования awk's getline. В этом случае:

$ awk 'FNR==NR{a[NR]=$0;next} {print} (FNR % 3)==0{print a[FNR/3]}' file2.txt file1.txt
1
2
3
A
4
5
6
B

Как это работает

  • FNR==NR{a[NR]=$0;next}

    При чтении первого файла file2.txtмы сохраняем его строки в массиве a, а затем пропустить остальные команды и перейти к строке ввода next.

  • print

    Если мы попали сюда, то читаем второй файл, file1.txtи печатаем его строку.

  • (FNR % 3)==0 {print a[FNR/3]}

    Если номер строки в файле file1.txtчетно кратен 3, то печатаем строку из файла file2.txt, номер строки которого составляет одну треть от текущей строки в file1.txt.

4
27.01.2020, 20:46

Сpaste:

paste -d '\n' <file1.txt - - - file2.txt

хотя он будет продолжать выводить строки после того, как один из файлов будет исчерпан, если в другом файле все еще остались строки, как в вашем образце.

Сawk:

awk '{print}; NR % 3 == 0 {getline < "file2.txt"; print}' file1.txt

Или эквивалент GNU sed:

sed '3~3 R file2.txt' file1.txt

На этот раз остановитесь, как только file1.txtбудет исчерпан, но продолжайте, если file2.txtисчерпан (и выведите пустые строки в варианте awkи ничего в варианте GNU sed).

Чтобы остановить, как только один из файлов будет исчерпан:

awk '{print}
     NR % 3 == 0 {
       if ((getline < "file2.txt") <= 0) exit
       print
     }' file1.txt
9
27.01.2020, 20:46

Использование Python:

Код:

with open(sys.argv[1], 'rU') as f1, open(sys.argv[2], 'rU') as f2:
    while f1 or f2:
        for i, line in enumerate(f1):
            print line.strip()
            if i == 2:
                break
        if f2:
            try:
                print(next(f2).strip())
            except StopIteration:
                f2 = None

Результаты:

1
2
3
A
4
5
6
B
0
27.01.2020, 20:46

Теги

Похожие вопросы