Чтобы получить все имена файлов, вы должны полагаться на пустые удаленные строки:
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
$ 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
.
С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
Использование 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