Usando o comando cut e sed ao mesmo tempo em um script

1

Eu tenho o seguinte código em um script 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, i.e. the file
cat /dev/stdin | cut -d ' ' --fields=2,3 | sort && sed -n '2 p' /dev/stdin 

Então, o que eu quero é imprimir os 2º e 3º campos com espaço como delimitador e também imprimir a segunda linha do report.txt usando sed . Então, como posso fazer isso?

ATUALIZAÇÃO:

O conteúdo do meu report.txt é:

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

Eu editei meu script como sugerido e agora é o seguinte:

#!/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, i.e. the file
cat /dev/stdin | cut -d ' ' --fields=2,3 | sort | sed -n '2 p'

Eu corro meu script como cat report.txt | ./summary , onde summary é o nome do meu arquivo de script. Agora a saída é Books 5 .

Além de imprimir o segundo e o terceiro campos, também quero imprimir a segunda linha do report.txt, ou seja, a saída deve ser a seguinte:

Books 5
Colorpen 2
Eraser 1
Khata 3
Pen 12
Sharpner 1
Sharif Sharpner 1
    
por Apollonius 22.08.2018 / 15:57

2 respostas

3

Ao encadear no comando sed com && , você disse ao shell para executar esse comando separadamente. Isso deixou a saída cat ... cut ... sort sozinha e então também imprimiu a segunda linha, sem nenhum corte.

Se você deseja imprimir apenas a segunda linha (classificada) de entrada, altere-a para:

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

Não há necessidade de repetir / dev / stdin, pois ambos cut e sed lerão stdin quando você não fornecer um arquivo de entrada.

Para imprimir os 2º e 3º campos delimitados por espaço de um arquivo, assim como imprimir toda a segunda linha, você pode fazer tudo dentro do sed:

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

Isso diz ao sed que executam dois programas:

  • p rint linha 2 e
  • s earch e replace: desde o início da linha, zero ou mais caracteres não espaciais, seguidos por um espaço ... com: (nada)

Quando executado em sua entrada de amostra atualizada, recebo:

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

... pois Sakib Khata 3 é a segunda linha do arquivo.

    
por 22.08.2018 / 16:16
1

Leia o conteúdo de /dev/stdin para uma variável:

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

cat é padronizado para leituras de stdin .

Exemplo:

(
  content=$(cat);
  echo "$content" | cut -d ' ' --fields=2,3 | sort;
  echo "$content" | sed -n '2p'
) < <(echo -e "a b c\nd e f\ng h i\n")


b c
e f
h i
d e f

Atualização:

Exemplo da sua pergunta editada

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
    
por 22.08.2018 / 16:17