Это альтернативный подход, который может быть медленным для миллионов файлов по сравнению с чистыми решениями awk.
Используя что-то подобное, вы можете транспонировать строки в столбцы:
$ cat file1
1 0 0 0 0 0 0 0 0 0 1 2 1
0 0 0 0 0 0 0 0 0 0 0 0 0
$ paste -d'-' <(head -n1 file1 |tr -s ' ' '\n') <(tail -n1 file1 |tr -s ' ' '\n')
1-0
0-0
0-0
0-0
0-0
0-0
0-0
0-0
0-0
0-0
1-0
2-0
1-0
Затем вы можете заменить все вхождения 0-0
на 9-9
простым sed и сохранить вывод во временной переменной:
$ f1=$(sed 's/0-0/9-9/g' <(paste -d'-' <(head -n1 file1|tr -s ' ' '\n') <(tail -n1 file1 |tr -s ' ' '\n')))
$ echo "$f1"
1-0
9-9
9-9
9-9
9-9
9-9
9-9
9-9
9-9
9-9
1-0
2-0
1-0
Теперь вы можете вернуться от столбцов к строкам, например:
$ awk -F'-' 'NR==FNR{printf "%s ",$1;p=1;next}p{printf "\n";p=0}{printf "%s ",$2}END{printf "\n"}' <(echo "$f1") <(echo "$f1")
1 9 9 9 9 9 9 9 9 9 1 2 1
0 9 9 9 9 9 9 9 9 9 0 0 0
И вы также можете добавить >file1
в конце последней команды awk, чтобы перезаписать file1
новым содержимым.
Осталось только перебрать все файлы. Можно сделать с помощью цикла bash:
for f in./wa_filtering_DP15_good_pops_snps_file_*;do
f1=$(sed 's/0-0/9-9/g' <(paste -d'-' <(head -n1 "$f"|tr -s ' ' '\n') <(tail -n1 "$f" |tr -s ' ' '\n')))
awk -F'-' 'NR==FNR{printf "%s ",$1;p=1;next}p{printf "\n";p=0}{printf "%s ",$2}END{printf "\n"}' <(echo "$f1") <(echo "$f1") #>"$f" #uncomment >"$f" to overwrite the files...
done
После небольшого исследования я заметил, что ядро было обновлено до 5.3 с 5.0, это, безусловно, было связано с системными обновлениями. После понижения ядра до 5.0 все пришло в норму. Я не знаю, что не так с версией 5.3, но это привело к очень высокой загрузке процессора, особенно процессу mount.ntfs, который составляет от 60 до 70 процентов.Кажется, что весь рабочий стол kde зависает, когда происходит копирование больших файлов. Даже на фат 32 проблема была. Я также пробовал ядро 5.4, там была такая же проблема.