Удалите несколько столбцов с помощью awk или sed

У меня есть база данных с 6 037 разделенными пробелом столбцами и 450 строками как та ниже:

1807 1452 1598 1 6.655713  A B A B ... 0 
1808 1452 1763 1 9.362033  0 0 A B ... A 
1809 1452 1527 2 6.728534  A B A A ... B 
1810 1452 1367 2 9.4055  A B A A B ... A 
... ... ... ... ... ... ... ... ... ...
1812 1452 1258 1 6.363032  0 0 A B ... B

Я хочу получить новую базу данных только с первыми 676 столбцами.

Предпочтительно, некоторая форма, которая использует awk или sed команда.

3
задан 22 March 2019 в 02:36

3 ответа

Если разделитель столбца в Вашем файле является отдельным символом, например, пространством, cut может сделать это легко:

cut -d' ' -f-676 <in >out

Это печатает только разделенные пробелом столбцы сначала к 676-му.

Если Вам нужно, например, каждый пробельный символ для подсчета как разделитель, a sed решение:

sed -r 's/\s+\S+//677g' <in >out

Это заменяет каждый столбец (= по крайней мере один пробельный символ, сопровождаемый по крайней мере одним непробельным символом) начало с 677-го ни с чем. Используя группы символов можно указать любой набор разделителей, в которых Вы нуждаетесь, например, для “4”, “#\” и “K”:

sed -r 's/[4#K]+[^4#K]+//677g' <in >out

Для разумного awk подход любезно обращается к ответу steeldriver, но вот является другой цикличным выполнением по столбцам и только печатью их (разделенный FS) если их число <= 676:

awk '{for (i=1;i<=676;i++) {printf (i==1?"":FS)$i}; print ""}' <in >out

Для группы символов необходимо указать выходного разделителя полей для вывода, например, для [4#K] и "sep":

awk -F'[4#K]' '{for (i=1;i<=676;i++) {printf (i==1?"":"sep")$i}; print ""}' <in >out
7
ответ дан 1 December 2019 в 12:57

Для односимвольного разделителя (такого как пространство или запятая) я рекомендовал бы использовать cut управляйте по также awk или sed.

Однако, так как Вы спросили о awk а именно, я думаю, что разумный способ сделать это состоял бы в том, чтобы постепенно уменьшить полевое количество:

awk -v last=676 '{NF = last} 1' datafile

Протестированный в GNU Awk (gawk) и mawk.

4
ответ дан 1 December 2019 в 12:57

Вы могли использовать

mlr --nidx --fs ' ' --repifs cat inputFile.csv | cut -d ' ' -f-2

Таким образом с mlr (https://github.com/johnkerl/miller/releases/tag/5.4.0) Вы управляете разделителями полей (если у Вас есть больше чем одни пробелы, они становятся один на поле), и с сокращением Вы извлекаете (в моем примере) первые два поля.

От

1807   1452 1598  1 6.655713  A B A B
1808 1452 1763 1  9.362033  0 0 A B
1809 1452 1527 2 6.728534  A B   A A
1810 1452 1367 2 9.4055  A B A A B

кому:

1807 1452
1808 1452
1809 1452
1810 1452

Некоторые примечания об опциях Miller:

  • --nidx должен установить формат; это - универсальная таблица с номером индекса (первое поле равняется 1, второе равняется 2, ECC..);
  • --fs установить разделитель (вот пространство);
  • --repifs средства, которые несколько последовательных случаев разделителя полей считают как один
  • cat передачи вводят записи непосредственно для вывода.
3
ответ дан 1 December 2019 в 12:57

Другие вопросы по тегам:

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