Извлечь целые числа из файла и вывода в другой файл?

У меня есть следующий файл foo.txt:

1
AbcdJ
8192
Pak78
8291

Мне нужен скрипт bash, который извлекает все строки, содержащие только целые числа (например, 1, 8192, но не AbcdJ или Pak78) и выводит его to bar.txt.

1
задан 16 July 2016 в 23:16

2 ответа

Решение AWK:

$> cat input.txt
1
AbcdJ
8192
Pak78
8291
3 blind mice
$> awk '/^[[:digit:]]+$/' input.txt
1
8192
8291

Используйте > для перенаправления вывода в файл

awk '/^[[:digit:]]+$/' input.txt > output.txt
6
ответ дан 23 May 2018 в 08:05
  • 1
    sed -n '1p;3p;5p' также печатает целые числа из файла foo.txt, заданные в вопросе, так как они появляются на первой, третьей и пятой строках. Однако, когда возникает вопрос, «у меня есть следующий файл», мы обычно интерпретируем это как означающее: «У меня есть файл, подобный следующему ...». Вопрос задает решение, которое извлекает все строки, содержащие только целые числа . Ваш ответ будет извлекать каждую строку, которая начинается с цифры ; например, 3 blind mice. Постскриптум Когда вопрос задает имена файлов, полезно использовать те же имена файлов в вашем ответе. – G-Man 17 July 2016 в 02:16
  • 2
    @ G-Man очень действительная точка. Регулярное выражение первоначально читается как starting with digit and followed by zero or more matches of next char. Я исправил это, чтобы прочитать line starting and followed by one or more matches of a digit, и включил ваш пример в выходной образец. Что касается имен файлов, люди могут быть не знакомы с синтаксисом AWK, поэтому я считаю, что лучше быть явным и указывать, что является входным файлом и что является выходным файлом. Приятно использовать одинаковые имена, но моя цель - дать четкий ответ, а не красивые. – Sergiy Kolodyazhnyy 17 July 2016 в 02:39

Некоторые другие инструменты:

sed:
$ sed -n '/^[0-9]\+$/ p' foo.txt
1
8192
8291
bash, медленнее, чем другие подходы:
$ while IFS= read -r line; do [[ $line =~ ^[0-9]+$ ]] && echo "$line"; done <foo.txt
1
8192
8291

Чтобы сохранить вывод в другом файле, используйте перенаправление вывода, >:

sed -n '/^[0-9]\+$/ p' foo.txt >output.txt
while IFS= read -r line; do [[ $line =~ ^[0-9]+$ ]] && echo "$line"; done <foo.txt >output.txt
2
ответ дан 23 May 2018 в 08:05

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

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