У меня есть файл, например, с тремя столбцами
12345678910 14567855858855 12345678510750078
Я хочу рассмотреть только первые 10 цифр из третьего столбца с помощью sed или awk.
ожидаемый результат:
1234567851
Пожалуйста помоги
Эта команда 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 строками вашего входного файла.
Perl на помощь:
perl -lne 'print /(\d{10})\d*$/' < filename
-n
читает строку ввода построчно-l
добавляет новые строки для вывода$
соответствует концу строки, первые 10 цифр, предшествующие любым другим цифрам перед концом, фиксируются, и /.../
в контексте списка, наложенного print
возвращает, чтоВы можете попробовать:
awk '{ print $3; }' subject.txt | sed -n 's/\([0-9]\{10\}\).*/\1/p'
если вы используете только решение, попробуйте:
cat /tmp/textfile | sed -n -e '$!d;s/.*\s\([0-9]\{10\}\)[0-9]*$/\1/ p'
замена работала только на последней строке.