Seção de classificação do documento

1

Eu tenho alguns dados de exemplo abaixo (chame-o test.txt). Eu gostaria de dividir este grande documento em 3 documentos pesquisando os dois primeiros dígitos da quarta coluna. Eu sou bem novo com o Linux (Lubuntu 14.04) e examinei 'csplit' e 'awk', mas parece que não consigo acertar a sintaxe. (Eu estou escrevendo scripts BASH)

Antes:

test.txt

12-1-2014   Allow   00:00:00 00:00:00
12-1-2014   Allow   00:00:00 00:00:00   
12-2-2014   Allow   01:00:00 01:00:00
12-10-2014  Deny    01:00:00 01:00:00
12-10-2014  Deny    02:00:00 02:00:00
12-11-2014  Deny    02:00:00 02:00:00

Depois:

test1.txt

12-1-2014   Allow   00:00:00 00:00:00
12-1-2014   Allow   00:00:00 00:00:00

test2.txt

12-2-2014   Allow   01:00:00 01:00:00
12-10-2014  Deny    01:00:00 01:00:00

test3.txt

12-10-2014  Deny    02:00:00 02:00:00
12-11-2014  Deny    02:00:00 02:00:00
    
por Roboman1723 06.06.2014 / 20:14

3 respostas

0

Algo assim talvez:

#!/bin/bash

while read LINE ; do
 [[ -n "'echo $LINE | awk '{print " "$NF}' | grep ' 00:''" ]] && echo "$LINE" | tee -a test1.txt
 [[ -n "'echo $LINE | awk '{print " "$NF}' | grep ' 01:''" ]] && echo "$LINE" | tee -a test2.txt
 [[ -n "'echo $LINE | awk '{print " "$NF}' | grep ' 02:''" ]] && echo "$LINE" | tee -a test3.txt
done < test.txt

Onde:

while read LINE ; do ; done < FILE

é um loop que lê todas as linhas do FILE

[[ -n "'<command>'" ]] &&

significa que se <command> gerar uma string diferente de zero, então ...

echo "these are something"| awk {print $NF} | grep 'thing' 

significa: leia "estes são algo", mantenha apenas a última coluna e veja se "coisa" está nela.

echo "something" | tee -a FILE

significa: eu imprimo "algo" no FILE, sem sobrescrever nada e criando-o se ainda não existe.

    
por MrVaykadji 06.06.2014 / 20:28
0

Com awk , você poderia fazer

awk '{split($3,a,":"); print > "test"a[1]+1".txt";}' test.txt


Em bash puro não tenho certeza da melhor maneira - embora você possa fazer algo como

while read -r line; do 
  read -r a b c d <<< "$line"
  printf -v outfile "test%d.txt" $(( ${c%%:*} + 1 ))
  printf "%s\n" "$line" >> "$outfile"
done < test.txt
    
por steeldriver 06.06.2014 / 21:34
0

Experimente este script:

#!/bin/bash
while read line; do 
HOUR='echo $line | cut -d' ' -f3 | cut -d':' -f1';
echo $line >> test-$HOUR.txt;
done < test.txt

Para cada linha no arquivo, o comando cut divide a linha primeiro para space e, em seguida, para : . O resultado é usado como sufixo para o arquivo.

A saída é:

file-00.txt  file-01.txt  file-02.txt  

que contém linha para a hora 00, 01 e assim por diante.

    
por girardengo 06.06.2014 / 21:36