Извлеките символьные столбцы и добавьте разделитель, используя cut, awk или sed - PullRequest
0 голосов
/ 03 февраля 2020

У меня есть файл, который выглядит так:

foo 23   45
bar      46
baz 25   57

Это не файл с разделителями. Вместо этого основанные на символах столбцы имеют определенные значения c, которые задокументированы следующим образом:

  • Столбцы 1-3 представляют собой одну вещь.
  • Колонка 4 является наполнителем.
  • Столбцы 5-6 представляют вещь.
  • Столбцы 7-9 являются наполнителями
  • Столбцы 10-11 представляют вещь.

Примечание (а) разделители отсутствуют (столбцы-заполнители имеют неправильную длину) и (б) некоторые значимые столбцы заполнены пробелами.

Существуют тысячи столбцов.

I хотел бы извлечь определенные столбцы из этого файла и преобразовать их в более стандартный формат с разделителями. Поскольку столбцов тысячи, а документация касается только символьных индексов столбцов, я хотел бы использовать эти индексы в моей команде, а не semanti c индексы столбцов. Например, если бы я хотел первый и последний столбцы, я бы хотел, чтобы выходной файл выглядел следующим образом:

foo,45
bar,46
baz,57

, и я бы хотел, чтобы команда называла их 1-3 и 10-11 , в соответствии с документацией.

Я пытался

cut -c 1-3,10-11 file.txt

, но это не создает разделитель между двумя столбцами semanti c.

Я также мог бы попробовать :

awk '{print $1,$3}' fieldwidths="3 1 2 3 2" file.txt

, но для этого необходимо знать индексы столбцов semanti c, а не индексы символьных столбцов. Учитывая, что есть тысячи столбцов, а документация ссылается только на индексы символьных столбцов, это будет очень сложно. Чтобы понять, насколько это сложно, см. Документацию (около 25% пути вниз) ftp: //ftp.cdc.gov/pub/Health_Statistics/NCHS/Dataset_Documentation/DVS/periodlinked /LinkPE17Guide.pdf. Это только один из десятков похожих наборов данных, которые мне нужно прочитать.

Спасибо!

1 Ответ

0 голосов
/ 03 февраля 2020

Я разобрался с ответом: gcut из GNU Coreutils (не cut, предварительно установленный на мою ма c) имеет опцию --output-delimiter:

gcut -c 1-3,10-11 --output-delimiter=',' file.txt
...