Intereting Posts
Что вы используете параметр -t "tag" для журнала? Как отредактировать файл на удаленной машине с помощью текстового редактора? Как переписать все поддомены, кроме одного Разрешить пользователям, не являющимся root, монтировать кеперизованную долю CIFS только в своем доме Установите приложение по умолчанию на основе имени файла, а не mimetype Программное обеспечение для мониторинга сервера Linux обмен словами с awk вокруг символа / текста ("to") Любые советы для выживания Terminal.app? Переписать системный вызов в пользовательском пространстве device-mapper: перезагрузить ioctl в кеше1 не удалось: занято или занято ресурсом Прочитать весь файл в памяти? php не работает (исходный файл) rsyslog: Как я могу гарантировать, что rsyslog предоставляет сообщение об ошибке / отладке всякий раз, когда сообщения отбрасываются? Использование физического физического жесткого диска в виртуальной машине с умными возможностями и истинным номером модели SD-карта интерпретируется как неправильный размер

Использование команды cut и sed одновременно в скрипте

У меня есть следующий код в скрипте Bash:

#!/bin/bash # gives summary of my buyings in the report.txt file echo Here is the summary of your purchases: echo ========================================= echo # /dev/stdin is the standard input, ie the file cat /dev/stdin | cut -d ' ' --fields=2,3 | sort && sed -n '2 p' /dev/stdin 

Итак, я хочу напечатать 2-е и 3-е поля с пробелом в качестве разделителя, а также напечатать вторую строку report.txt, используя sed . Так как я могу это сделать?

ОБНОВИТЬ:

Содержимое моего report.txt:

 Jakaria Books 5 Sakib Khata 3 Afzal Pen 12 Sharif Colorpen 2 Sakib Eraser 1 Sharif Sharpner 1 

Я отредактировал свой сценарий, как это было предложено, и теперь это следующее:

 #!/bin/bash # gives summary of my buyings in the report.txt file echo Here is the summary of your purchases: echo ========================================= # /dev/stdin is the standard input, ie the file cat /dev/stdin | cut -d ' ' --fields=2,3 | sort | sed -n '2 p' 

Я запускаю свой скрипт как cat report.txt | ./summary cat report.txt | ./summary где summary – это имя моего файла скрипта. Теперь на выходе Books 5 .

Помимо печати 2-го и 3-го полей я также хочу напечатать 2-ю строку файла report.txt, то есть вывод должен быть следующим:

 Books 5 Colorpen 2 Eraser 1 Khata 3 Pen 12 Sharpner 1 Sharif Sharpner 1 

Когда вы связали команду sed с && вы сказали оболочке запускать эту команду отдельно. Это оставляло cat ... cut ... sort вывод в одиночку, а затем также печатать 2-ую строку без обрезки.

Если вы хотите напечатать только вторую (отсортированную) строку ввода, измените ее на:

 cut -d ' ' --fields=2,3 | sort | sed -n 2p 

Нет необходимости повторять / dev / stdin, так как cut и sed будут читать stdin, если вы не предоставите входной файл.


Чтобы напечатать 2-е и 3-е разделенные пробелами поля из файла, а также напечатать всю 2-ю строку, вы можете сделать все это в Sed:

 sed -e 2p -e 's/^[^ ]* //' < report.txt | sort 

Это говорит о том, что sed выполняет две программы:

  • печатная строка 2 и
  • s найти и заменить: в начале строки ноль или более непробельных символов, после которых следует пробел ... с: (ничего)

При запуске на вашем обновленном примере ввода я получаю:

 Books 5 Colorpen 2 Eraser 1 Khata 3 Pen 12 Sakib Khata 3 Sharpner 1 

... так как Sakib Khata 3 - это вторая строка файла.

Прочитайте содержимое /dev/stdin в переменной:

 content=$(cat) echo "$content" | cut -d ' ' --fields=2,3 | sort echo "$content" | sed -n '2p' 

cat умолчанию читает из стандартного stdin .

Пример:

 ( content=$(cat); echo "$content" | cut -d ' ' --fields=2,3 | sort; echo "$content" | sed -n '2p' ) < <(echo -e "abc\nd ef\ng hi\n") bc ef hi def 

Обновить:

Пример из вашего отредактированного вопроса

 echo 'Jakaria Books 5 Sakib Khata 3 Afzal Pen 12 Sharif Colorpen 2 Sakib Eraser 1 Sharif Sharpner 1' | ( content=$(cat); echo "$content" | cut -d ' ' --fields=2,3 | sort; echo "$content" | sed -n '2p' ) Books 5 Colorpen 2 Eraser 1 Khata 3 Pen 12 Sharpner 1 Sakib Khata 3