Skip to content

Розбиваємо файл на декілька інших файлів за фільтром

Іноді стикаюсь з тим, що треба розбити великий файл на декілька менших і при цьому зміст нових файлів повинен відповідати певним фільтрам. І сьогодні я розповім, як вирішити цю проблему за допомогою bash-скрипту.

Для початку, нам потрібен файл з тестовими даними, що містить нулі, одиниці та двійки. Згенеруємо його наступною командою:

$ seq 1000 | awk '{print $0 % 3}' > /tmp/data.txt

А тепер, саме цікаве, ми візьмемо вивід команди cat та за допомогою tee перенаправимо його на введення команді grep, яка за необхідним шаблоном відфільтрує текст у потрібний файл:

1
2
3
4
5
cat /tmp/data.txt \
    | tee >(grep "^0$" > /tmp/0.txt) \
    | tee >(grep "^1$" > /tmp/1.txt) \
    | tee >(grep "^2$" > /tmp/2.txt) \
    > /dev/null

Як видно з коду, на виході ми отримаємо три файли - /tmp/0.txt, /tmp/1.txt та /tmp/2.txt. Перенаправлення у /dev/null в останньому рядку потрібно, аби не виводити зміст файлу /tmp/data.txt на термінал. Втім, якщо вам потрібна копія файлу, ви можете перенаправити виведення в інший файл.

Що ж, виконуємо команду та перевіряємо результат:

$ head -n2 /tmp/{0,1,2}.txt
==> 0.txt <==
0
0

==> 1.txt <==
1
1

==> 2.txt <==
2
2
$ wc -l /tmp/{0,1,2}.txt
 333 /tmp/0.txt
 334 /tmp/1.txt
 333 /tmp/2.txt
1000 total

Якщо у вас схожий результат - поздоровляю, ви навчились новому трюку в bash. ;)

Корисне

  1. Пошук по історії bash за допомогою курсорних клавіш
  2. Ізолюємо процес від доступу до мережі
  3. Імплементація unix socket клієнта до плеєра MOC
  4. Простий парсер логів HAProxy у реальному часі
  5. Аналіз даних за допомогою bash, StatsD та Grafana
  6. Оновлення BIOS на HP ProBook 4540s
  7. Примусове зупинення процесу з викликом коду 0