cortar a coluna 2 do arquivo de texto

15

Meu arquivo de texto não possui delimitador para especificar apenas espaços separadores. Como recortar a coluna 2 para o arquivo de saída,

39    207  City and County of San Francisc   REJECTED          MAT = 0
78    412  Cases and materials on corporat   REJECTED          MAT = 0
82    431  The preparation of contracts an   REJECTED          MAT = 0

Então a saída que eu preciso é

207
412
432
riley
fonte

Respostas:

13

É mais fácil com awkque trata vários espaços consecutivos como um único, então

awk '{print $2}' file

impressões

207
412
431

Mas, obviamente, existem muitas outras ferramentas que farão o trabalho, mesmo que não sejam projetadas para tarefas como grep:

grep -Po '^[^ ]+[ ]+\K[^ ]+' file
jimmij
fonte
6

Use tubos para enviar seus dados (por exemplo, cat columns.txt) para o corte.

cat columns.txt | cut -d" " -f5

Nos dados de exemplo que você forneceu, um único delimitador de espaço coloca os dados que você deseja no campo 5. Para enviar essa saída para outro arquivo, use o redirecionamento.

cat collumns.txt | cut -d" " -f5 > field2.txt

Usando o comando awk, você pode fazer algo como o abaixo, que reconhece automaticamente o campo que você procura, porque há dados lá (?). Eu preciso aprender mais sobre o awk.

awk -F' ' '{print $2}' columns.txt
aeiounix
fonte
3
A incatação cat ... |é raramente necessária. A maioria dos comandos do Unix, como cutum ou mais arquivos de entrada como argumentos, por exemplo cut -d" " -f5 columns.txt.
Denis Howe
1

como @jimmij disse, awk '{print $2}' fileé a resposta mais simples.

Se, por algum motivo, você não quiser usar awke insistir em usá- cutlo, poderá sedconverter todas as instâncias de dois ou mais espaços em uma única guia ( cutdelimitador padrão da impressora) antes de canalizar para o corte:

$ sed -e 's/  \+/\t/g' riley.txt | cut -f2 
207
412
431
cas
fonte
0

Você ainda pode usar espaços únicos como seu delimitador, apenas terá mais colunas. Aumente o valor atribuído cut -d' ' -fde 2 para 5, ou talvez 6. Aumente o número até obter os resultados desejados.

Ryder
fonte
0
grep -Po '^[^ ]+[ ]+\K[^ ]+' file

Acima, é muito útil quando utilitários Linux como o awk para extração de dados não funcionam se você estiver mudando para o usuário "root" dentro de um shell script, como abaixo:

sudo -i <<EOF
ps aux | grep -E -i "[l]js"  |grep -v "javaagent" | awk '{print $2}' # So awk won't work here
ps aux | grep -E -i "[l]js"  | grep -v "javaagent" | grep -Po '^[^ ]+[ ]+\K[^ ]+'
EOF
Alok Tiwari
fonte
1
O único motivo para " awknão funcionar" no seu exemplo é que o documento aqui não está entre aspas, o que significa que $2ele seria expandido pelo shell para o segundo parâmetro posicional. A solução provavelmente não é alternar para um grepcomando, mas escapar do $in $2as \$2ou simplesmente citar todo o documento usando <<'EOF'no lugar de <<EOF. Observe também que a tarefa no seu exemplo é mais simplesmente executada por pgrep.
Kusalananda
Muito obrigado @Kusalananda. Funcionou como um encanto.
Alok Tiwari