У меня есть база данных с 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
команда.
Если разделитель столбца в Вашем файле является отдельным символом, например, пространством, 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
Для односимвольного разделителя (такого как пространство или запятая) я рекомендовал бы использовать cut
управляйте по также awk
или sed
.
Однако, так как Вы спросили о awk
а именно, я думаю, что разумный способ сделать это состоял бы в том, чтобы постепенно уменьшить полевое количество:
awk -v last=676 '{NF = last} 1' datafile
Протестированный в GNU Awk (gawk
) и mawk
.
Вы могли использовать
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
передачи вводят записи непосредственно для вывода.