У меня есть файл, например, с тремя столбцами

12345678910 14567855858855 12345678510750078

Я хочу рассмотреть только первые 10 цифр из третьего столбца с помощью sed или awk.

ожидаемый результат:

1234567851

Пожалуйста помоги

4 ответа4

1

Эта команда Sed даст вам первые 10 цифр последнего столбца.
Ваш вопрос немного запутан с точки зрения первых или последних 10 или 14 цифр :-)
Но вы также можете настроить этот пример.

$ echo "12345678910 14567855858855 12345678510750078" \ 
| sed -n 's/.*\s\([0-9]\{10\}\)[0-9]*$/\1/ p'

1234567851

Интерпретация команды (так что вы можете изменить при необходимости).

 sed -n 's/.*\s\([0-9]\{10\}\)[0-9]*$/\1/ p'
     |   | | | | |          | |       |   ^ print what remains on the matched line
     |   | | | | |          | |       ^^ replace the line with the part of interest
     |   | | | | |          | ^^^^^^^ match for the last column
     |   | | | | |          ^^ mark the end of part we want to print
     |   | | | | ^^^^^^^^^^^ this will match 10 digits at the start of the last column
     |   | | | ^^ start marking the part we want to print
     |   | | ^ start matching the digits after a white-space char
     |   | ^^ pattern begins matching everything up to the part of interest
     |   ^ process only lines that match the given pattern
     ^^ do not print the original input string

Вы можете точно настроить это для ваших данных.
В настоящее время из-за части [0-9]*$ в этом правиле ожидается, что ваши данные не будут содержать пробелов или нечисловых символов после или внутри последнего столбца.

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

cat input-file.txt | <sed-command-above> > output-file.txt

или же

<sed-command-above> input-file.txt > output-file.txt

Первая форма показывает, как echo будет работать для всего многострочного файла.
Вы также можете выполнить короткий тест с head input-file.txt в команду sed, чтобы увидеть, как он работает с первыми 10 строками вашего входного файла.

0

Perl на помощь:

perl -lne 'print /(\d{10})\d*$/' < filename
  • -n читает строку ввода построчно
  • -l добавляет новые строки для вывода
  • $ соответствует концу строки, первые 10 цифр, предшествующие любым другим цифрам перед концом, фиксируются, и /.../ в контексте списка, наложенного print возвращает, что
0

Вы можете попробовать:

awk '{ print $3; }' subject.txt | sed -n 's/\([0-9]\{10\}\).*/\1/p'
0

если вы используете только решение, попробуйте:

cat /tmp/textfile |  sed -n -e '$!d;s/.*\s\([0-9]\{10\}\)[0-9]*$/\1/ p'

замена работала только на последней строке.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .