Для больших списков я обычно создаю в противоречии с, отрывают одну строку за один раз, затем независимо от того, что переменная операция, которую Вы хотите выполнить, может быть сделана надежно.. У меня были большие массивы (для строки в 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
Вы можете попробовать использовать 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
печатает полный столбец tr -d \\n <infile | tr \~ \\n | paste -d~ - - - - - - - - - - - - - -
Это сработает.
Непонятно, как решить, объединять ли разделенное поле с пробелом или без пробела. 06
необходимо удалить новую строку, тогда как разновидности
необходимо заменить пробелом.
Игнорируя вышеупомянутую проблему, мы можем прийти к этой прототипной команде 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
.
Для этой логики может быть необходимо понять тип данных конкретного поля, которое требует удаления новой строки, чтобы, например, обрабатывать даты особым образом.