Разделение файлов с помощью команды Linux awk
В этом руководстве вы узнаете, как разделить большие файлы на более мелкие с помощью awk команды в Linux.
Я расскажу, как разделить файлы на основе количества строк, конкретных условий, шаблонов или при добавлении пользовательских заголовков.
Разделение на основе количества строк
Давайте начнем с разделения файла образца data.txt на файлы меньшего размера, каждый из которых содержит 1000 строк.
awk '{split(FILENAME, a, "."); prefix=a[1]; print > (prefix "." int((NR-1)/1000) + 1 ".txt"))}' data.txt
Эта команда разделит data.txt файл на несколько выходных файлов, каждый из которых содержит 1000 строк.
Выходные файлы будут называться data1.txt, data2.txt и так далее, в зависимости от количества строк в исходном файле.
Условное разделение
Допустим, вы хотите разделить файл с именем data.txt на два отдельных файла: один, содержащий строки, где значение второго столбца больше 50, и другой файл, содержащий строки, где значение второго столбца меньше или равно 50.
awk '{ split(FILENAME, a, "."); if ($ 2> 50) print >> (a[1] "_greater_than_50.txt"); else print >> (a[1] "_less_than_or_equal_to_50.txt") }' data.txt
Эта команда разбивает data.txtфайл на два отдельных файла: data_greater_than_50.txtсодержащий строки, где значение второго столбца больше 50, и data_less_than_or_equal_to_50.txtсодержащий строки, где значение второго столбца меньше или равно 50.
Разделите на основе шаблона
Допустим, вы хотите разделить файл с именем data.txt на несколько файлов на основе определенного шаблона в строках.
Чтобы разделить файл на отдельные файлы на основе строк, содержащих слово “pattern”, вы можете использовать следующую команду awk:
awk '/pattern/ { split(FILENAME, a, "."); print >> (a[1] "_pattern.txt") }' data.txt
Разделите файл с заголовком
Допустим, у вас есть файл с именем data.txt, который вы хотите разделить на файлы меньшего размера, каждый с заголовком, указывающим тип содержимого.
Например, давайте разделим файл на файлы меньшего размера с заголовком, указывающим “Data Set”, за которым следуют строки.
awk 'BEGIN {header="Data Set"} { split(FILENAME, a, "."); if (NR%1000 == 1) {filename = a[1] "_" int(NR/1000) ".txt"; print header > filename} print >> filename }' data.txt
Эта команда разделит data.txtфайл на несколько выходных файлов, каждый из которых содержит 1000 строк, и перед ним будет заголовок, указывающий “Набор данных”.
Выходные файлы будут называться соответствующим образом, например data_1.txt, data_2.txtи так далее.