1. Décima Linha
Como você imprimiria apenas a 10ª linha de um arquivo?
Por exemplo, suponha que o arquivo.txt tenha o seguinte conteúdo: Linha 1 Linha 2 Linha 3 Linha 4 Linha 5 Linha 6 Linha 7 Linha 8 Linha 9 Linha 10
Seu script deve imprimir a décima linha, que é: Linha 10 -------------------
# Lê do arquivo.txt e exibe a décima linha no stdout.
#Solução Um:
#head -n 10 arquivo.txt | tail -n +10
#Solução Dois:
#awk 'NR==10' arquivo.txt
#Solução Três:
sed -n 10p arquivo.txt
Conceitos abordados:
->head é utilizado para exibir o início dos arquivos na saída padrão, por padrão o comando head imprime as primeiras 10 linhas de seus respectivos arquivos.
Formato de sintaxe: head [parâmetros]... [arquivo]...
Parâmetros do comando:
-q ocultar nome do arquivo
-v exibir nome do arquivo
-c<bytes> exibir número de bytes
-n<linhas> exibir número de linhas
->O comando tail é utilizado para exibir o conteúdo final de arquivos especificados, quando não é especificado um arquivo, ele processa as informações de entrada. Geralmente utilizado para visualização de arquivos de log.
Parâmetros do comando:
-f leitura contínua
-q não exibir informações de processamento
-v exibir informações detalhadas de processamento
-c<número> exibir número de bytes
-n<linhas> exibir número de linhas
--pid=PID com -f, termina quando o processo ID, PID morre.
-q, --quiet, --silent nunca exibir o cabeçalho com o nome do arquivo
-s, --sleep-interval=S com -f, pausa por S segundos entre cada repetição.
Pode referir-se: Comandos Linux que eu usei - tail - Saída do final do arquivo/monitoramento dinâmico do final do arquivo
->awk é uma poderosa ferramenta de análise de texto, em relação à busca do grep e edição do sed, awk se destaca particularmente na análise de dados e geração de relatórios. Em termos simples, awk lê o arquivo linha por linha, usa o espaço como delimitador padrão para dividir cada linha e depois realiza várias análises e processamentos nos segmentos.
Formato de sintaxe:
awk '{padrão + ação}' {nomes de arquivos}
padrão representa o conteúdo que AWK procura nos dados, e ação é uma série de comandos executados quando o conteúdo correspondente é encontrado.
Pode referir-se: Detalhes do comando awk linux
->sed é um editor online que processa o conteúdo linha por linha. Durante o processamento, ele armazena a linha atualmente processada em um buffer temporário, chamado de "espaço de padrão" (pattern space), em seguida, usa os comandos sed para processar o conteúdo do buffer, após o processamento, envia o conteúdo do buffer para a tela. Em seguida, processa a próxima linha, repetindo continuamente até o final do arquivo.
Formato de sintaxe:
sed [-hnV][-e<script>][-f<script>][arquivo de texto]
- Transpor Arquivo Dado um arquivo de texto arquivo.txt, transponha seu conteúdo.
Você pode assumir que cada linha tem o mesmo número de colunas e cada campo é separado pelo caractere ' '.
Por exemplo, se arquivo.txt tiver o seguinte conteúdo:
nome idade alice 21 ryan 30 Exiba o seguinte:
nome alice ryan idade 21 30
---------
# Lê do arquivo.txt e imprime seu conteúdo transposto para stdout.
# usando awk para este propósito
awk '
{
for(i=1; i<=NF; i++)
{
if(coluna[i] == "")
{
coluna[i] = $i
}
else
{
coluna[i] = coluna[i]" "$i
}
}
}
END{
for(i=1; i<=NF; i++)
{
print coluna[i]
}
}
' arquivo.txt
Se o número de colunas to dois, pode usar o seguinte método:
teste2
nome idade
alice 21
ryan 30
solução:
MindeMacBook-Pro:notes minzhu$ cut -d " " -f1 teste2 |xargs
nome alice ryan
MindeMacBook-Pro:notes minzhu$ cut -d " " -f2 teste2 |xargs
idade 21 30
- Números de Telefone Válidos
Dado um arquivo de texto arquivo.txt que contém uma lista de números de telefone (um por linha), escreva um script bash de uma linha para imprimir todos os números de telefone válidos.
Você pode assumir que um número de telefone válido deve aparecer em um dos seguintes dois formatos: (xxx) xxx-xxxx ou xxx-xxx-xxxx. (x significa um dígito)
Você também pode assumir que cada linha no arquivo de texto não contém espaços em branco no início ou no final.
Por exemplo, suponha que arquivo.txt tenha o seguinte conteúdo:
987-123-4567
123 456 7890
(123) 456-7890
Seu script deve imprimir os seguintes números de telefone válidos:
987-123-4567
(123) 456-7890
------------
arquivo.txt
987-123-4567
123 456 7890
(123) 456-7890
solução1:
grep -e '\(^[0-9]\{3\}-[0-9]\{3\}-[0-9]\{4\}$\)' -e '\(^([0-9]\{3\})[ ]\{1\}[0-9]\{3\}-\([0-9]\{4\}\)$\)' arquivo.txt
explicação:
- No Bash, usamos
\para escapar o próximo caracteer; ^é usado para denotar o início de uma linha$é usado para denotar o final de uma linha{M}é usado para denotar corresponder exatamenteMvezes ocorrência/regex anterior(...)é usado para agrupar padrões/regex juntos
Voltando a este problema: ele nos pede para corresponder a dois padrões, para melhor legibilidade, usei -e e separei os dois padrões em duas regexes, a primeira corresponde a este caso: xxx-xxx-xxxx e a segunda corresponde a este caso: (xxx) xxx-xxxx
solução2:
awk < arquivo.txt '/^[0-9][0-9][0-9]\-[0-9][0-9][0-9]\-[0-9][0-9][0-9][0-9]$/ || /^\([0-9][0-9][0-9]\) [0-9][0-9][0-9]\-[0-9][0-9][0-9][0-9]$/ {print}'
O formato para 'awk': awk < arquivo 'padrão {ação}' ou awk 'padrão {ação}' arquivo
Nota: a ação 'print' sem argumentos significa imprimir toda a linha.
4.Frequência de Palavras
Escreva um script bash para calcular a frequência de cada palavra em um arquivo de texto palavras.txt.
Para simplificar, você pode assumir:
palavras.txtcontém apenas caracteres minúsculos e espaços' '.- Cada palavra deve consistir apenas em caracteres minúsculos.
- As palavras são separadas por um ou mais caracteres de espaço em branco.
Por exemplo, suponha que palavras.txt tenha o seguinte conteúdo:
o dia é ensolarado o o
o ensolarado é é
Seu script deve imprimir o seguinte, ordenado por frequência decrescente:
o 4
é 3
ensolarado 2
dia 1
-----------------
palavras.txt
o dia é ensolarado o o
o ensolarado é é
solução1:
awk '{for(i=1;i<=NF;i++) contador[$i]++} END {for(k in contador) print k,contador[k]}' palavras.txt | sort -k2 -nr
solução2:
sed 's/^\s+//g; s/\s+/ /g; s/\s+$//g' palavras.txt | tr ' ' '\n' | sort | uniq -c | sort -nr | awk -F' ' '{print $2" "$1}'
- use sed para remover espaços no início e no fim, e mudar espaços inline para um espaço
- use tr para transformar espaço em linha (estes dois passos também podem ser feitos cat palavras.txt | tr -s ' ' '\n')
- ordenar as palavras
- uniq para contar palavras
- ordenar o resultado estatístico, -n para ordenação numérica, -r para reverso
- use awk para formaatr a saída
Referência: leetcode