Разделение файла на основе одного столбца

Está descrito en la página a la que se vinculó:

Initially, you will only need to download and use the first image of a set (labelled as debian-something-1 to be able to start the Debian installer and set up Debian on your computer. If there are more images available here (labelled debian-something-2, debian-something-3, etc.), they contain the extra packages that can be installed on a Debian system (as mentioned previously). They will not be bootable and are entirely optional. If you have a fast Internet connection, you're most likely better off installing any desired extra packages directly from the Debian mirrors on the Internet instead of by using these extra images.

Eso significa que debe usar debian -9.4.0 -amd64 -DVD -1.iso para instalar Debian. También es una buena idea intentar ejecutar Debianen un entorno virtual para probarlo antes de reemplazar su sistema operativo actual.

1
15.07.2019, 16:29
3 ответа

Вы можете получить наилучшие результаты от awk:

awk '{ print > "index i"$2 }' < input

Вы также можете сделать это только в оболочке:

while read a b c
do
        printf '%s\n' "$a $b $c" >> "index i$b"
done < input

Решение awk имеет следующие преимущества:

  • Существующие файлы будут перезаписаны. Сценарий оболочки будет добавлен к существующим файлам. (Я полагаю, это может быть то, что вы хотите. В таком случае, вы можете добиться этого, используя >>вместо >в сценарии awk.)
  • Сценарий awk сохраняет интервал во входном файле. Сценарий оболочки сокращает несколько пробелов до одиночных.
  • Для больших файлов данных сценарий awk может работать немного быстрее.
1
28.01.2020, 00:06

Команда

  for i in `awk '{if(!seen[$2]++)print $2}' y.txt`;do awk -v i="$i" 'BEGIN {print "index i"i}$2==i {print $0}END {print "========================================"}' y.txt; done

выход

index i1
M1  1   1233
M2  1   3212
M3  1   55323
M4  1   4444233
M5  1   23444
M6  1   555333
M7  1   55567
========================================
index i2
M8  2   22224
M9  2   55566
M10 2   4567
========================================
index i3
M11 3   44242
M12 3   234234
========================================
index i4
M13 4   2233
M14 4   2442
M15 4   322352
M16 4   235242
M17 4   2324524
========================================
index i5
M18 5   232342
========================================
index i6
M19 6   2322523
M20 6   2332523
========================================
-1
28.01.2020, 00:06

Чтобы добавить к G -Ответ человека:да, вы можете добиться точно такого же результата, используя только sh (, так как это было спецификацией в вашем дублирующем вопросе там , на который я ответил 9 часов до G -Человек ответит здесь ).

Существует встроенная функция set, которая позволяет вам назначать значения для$1$2и $3и так далее. Вот цитата из справочной страницы bash (, это также относится к sh):

установить [{ -опции | +опции | --}] аргумент...

The third use of the set command is to set the values of the shell's positional parameters to the specified args. To change the positional parameters without changing any options, use “--” as the first argument to set. If no args are present, the set command will clear all the positional parameters (equivalent to executing “shift $#”.)

Так что можно:

set -f
while read ln; do
    set -- $ln
    printf '%s\n' "$ln" >> "index i"$2
done < input
set +f

В set -- $ln, $lnразбивается на поля, и n-е поле назначается n-му позиционному параметру.

Цитата вокруг $lnв следующей строке обеспечивает целостность содержимого (с сохранением пробелов и т. д. ).

set -fи set +fпредназначены для предотвращения подстановки символов, таких как *и ? в файле с путаницей set. Спасибо Скотту за то, что поднял эту тему.

Вместо printfя изначально использовал echo. Но благодаря второму комментарию Скотта (, если противник меняет строку на echoс такими опциями, как -n, -eи т. д.,тогда echoзапутается ), printfвместо этого используется для защиты от этого.

Это показывает, что sh, вероятно, не идеальный выбор для такого рода работы. По крайней мере, используйте bash с поддержкой регулярных выражений. Но, это выполнимо, если вы попробуете.

Что касается awk, то он не "немного быстрее", а быстрее на порядок, если не учитывать дисковый ввод-вывод. Поэтому предпочтительнее использовать awk.

Кстати, я уверен, что вы не слышали о поговорке «если два ответа — это слишком много, то два вопроса — это два слишком много».

since I just said it ;)

Но в следующий раз сделайте выбор и придерживайтесь его, чтобы мы все могли сосредоточить свои усилия на нем.

0
28.01.2020, 00:06

Теги

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