Por que o corte não funciona aqui como esperado com o delimitador?

0

Eu tenho este arquivo como entrada:

root      1243  0.0  0.0  65508  6036 ?        Ss   Apr30   0:05 /usr/sbin/sshd -D
root      7385  0.0  0.1 152932 10644 ?        Ss   16:22   0:00 sshd: per1 [priv]
per2  7425  0.0  0.0 152932  6216 ?        S    16:22   0:00 sshd: per2@pts/7
root      8256  0.0  0.1 152876 10240 ?        Ss   16:32   0:00 sshd: per3 [priv]
per3  8298  0.0  0.0 152876  5308 ?        S    16:32   0:00 sshd: per3@pts/9

Eu quero poder selecionar a primeira coluna de nomes exclusivos:

cut -f 1 file.txt | sort | uniq , mas isso não funcionará. Eu tenho que fazer cut -f 1 -d " " file.txt ...

Por que eu adiciono esse -d 1 ? No meu entender, quando os espaços entre as colunas são guias não , devemos escrever o que é. Neste caso, é " " , e é por isso que escrevemos. Está correto?

Então, como seleciono a segunda coluna aqui? Eu simplesmente mudei o cut -f 1 para cut -f 2 , mas isso não aconteceu. Minha saída para isso foi um monte de linhas vazias? Por quê? Por que funcionou para cut -f 1 , mas não para 2?

    
por K Split X 16.05.2018 / 02:12

1 resposta

1

Se você quer o primeiro campo espaço -separado com cut , então você tem que dizer para usar espaços ao invés do padrão de TABs:

link

-d, --delimiter=DELIM

use DELIM instead of TAB for field delimiter

Assim que você disser cut para usar espaços como o delimitador, é isso que ele usa, e então "campo 2" se torna o primeiro byte (s) após o primeiro espaço (até ver outro delimitador); no seu caso, isso é um espaço.

Use esses dados como um exemplo ilustrativo:

root 1space 2space 3space

... onde há um espaço antes de 1space , dois antes de 2space e três antes de 3space .

$ seq 1 7 | while read index; do echo "$index" - "$(cut -d' ' -f $index < input)"; done
1 - root
2 - 1space
3 -
4 - 2space
5 -
6 -
7 - 3space

Como você tem um número variável de espaços para separar os campos na entrada, sugiro que:

  • Se você estiver "alterando" os dados, use sed para reduzir vários espaços para um, como mostrou o steeldriver: sed 's/ */ /g' < input | cut -d' ' -f2 .
  • Caso contrário, considere uma ferramenta como awk que divide campos em vários separadores de campos subsequentes: awk '{print $2}' < input
por 16.05.2018 / 02:55