Единственная запись файла, добирающегося splitted по нескольким строкам

Для больших списков я обычно создаю в противоречии с, отрывают одну строку за один раз, затем независимо от того, что переменная операция, которую Вы хотите выполнить, может быть сделана надежно.. У меня были большие массивы (для строки в cat foo.bar; сделайте), переходят к частям.. К остроумию:

InCt=`cat foo.bar|wc -l`
RunCt=1
while [ $InCt -ge $RunCt ]; do
  LINE=`head -${RunCt} foo.bar|tail -1`

  # do whatever you need with the line

let RunCt="$RunCt +1"
done
3
20.02.2015, 17:10
3 ответа

Вы можете попробовать использовать SED :

sed -rn ':a;/^([^~]*~){13}[^~]*$/!{N;s/\n//;ba};p' yourfile.tsv

Что он делает

, скрипт имеет три части, разделенные ; :

  • : A определяет ярлык, которую мы можем отрасить до
  • / ^ ([^ ~] * ~) {13} [~ ~] * $ /! {n; s / \ n //; ba} поиск полной колонны
    • / ^ ([^ ~] * ~) {13} [~ ~] * $ / ищет строку с ровно 14 полей (0 или более вхождений чего-либо, что не является ~ ), разделенный 13 вхождений ~ .
    • ! инвертирует результат поиска (если не найден, то ...)
    • {n; s / \ n //; ba} блок, который выполняется, если столбец не завершен
      • N Читает в другой строке
      • S / \ N // Удаляет новую строку между двумя линиями
      • BA ветвями (B) к нашей ранее определенной метке (A)
  • P печатает полный столбец
0
27.01.2020, 21:31
tr -d \\n <infile | tr \~ \\n | paste -d~ - - - - - - - - - - - - - -

Это сработает.

1
27.01.2020, 21:31

Непонятно, как решить, объединять ли разделенное поле с пробелом или без пробела. 06 -JAN-10 необходимо удалить новую строку, тогда как разновидности до необходимо заменить пробелом.

Игнорируя вышеупомянутую проблему, мы можем прийти к этой прототипной команде Awk:

$ awk 'BEGIN { RS = "~" }
       { gsub(/\n/,"",$0);
         printf("%s", $0);
         if (++i < 14) { printf("~"); }
         else { i = 0; printf("\n"); } }' < in.txt > out.txt

Мы получаем awk для разделения записей на ~ , так что каждое поле фактически является записью. Затем просто вырежьте пробелы из каждой записи с помощью gsub и распечатайте его с разделителем, если это поля с 1 по 13, или с новой строкой, если оно равно 14 (и сбросьте счетчик).

Если количество полей не делится на 14, вы получите неполную последнюю строку в выводе, оканчивающуюся ~ вместо новой строки.

Возможный способ решения проблемы объединения - оставить символы новой строки на месте или, возможно, заменить их каким-либо символом, которого нет в данных. Сделайте соединение как шаг постобработки. Предположим, что @ не встречается в данных. Если мы заменим символы новой строки на @ , тогда мы сможем применить некоторые простые замены шаблонов с помощью обычных инструментов обработки текста. Например, замена по строкам s / ([0-9]) @ - / \ 1 - / обрабатывает разорванные даты, такие как 06 @ -JAN .

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

0
27.01.2020, 21:31

Теги

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