Como dividir um arquivo baseado em informações dentro de uma coluna no linux

4

Eu gostaria de separar essas linhas onde o valor na segunda coluna é menor que um valor específico.

exemplo de entrada:

id1 19501112
id2 19831207
id3 20001212
id6 20000101
id10 20061213
id11 20081212
id12 20100109
id13 20101218
id14 20101212
id15 20111111
id16 20150919
id20 20141415

e eu quero extrair as linhas cujo valor do segundo campo é menor que 20100101. Então, minha saída seria:

id1 19501112
id2 19831207
id3 20001212
id6 20000101
id10 20061213
id11 20081212

alguma sugestão por favor?

    
por zara 01.10.2015 / 02:10

5 respostas

7
$ awk '$2<20100101' file
id1 19501112
id2 19831207
1d3 20001212
id6 20000101
id10 20061213
id11 20081212

Um programa awk típico consiste em comandos semelhantes a:

condition { action }

No nosso caso, a condição é que a segunda coluna seja menor que 20100101. Esta condição é, razoavelmente, escrita como $2<20100101 . Como não fornecemos nenhuma ação , o awk faz a ação padrão que é imprimir a linha.

    
por 01.10.2015 / 02:13
4

Uma abordagem Perl:

perl -ane 'print if $F[1]<20100101' file

O -n lê o arquivo de entrada linha a linha e aplica o script fornecido com -e . O -a faz com que perl se comporte como awk , ele dividirá automaticamente cada linha de entrada no espaço em branco e salvará cada campo como um elemento da matriz @F . Assim, o próprio script imprimirá uma linha se o segundo campo ( F[1] , matrizes começar em 0) for menor que 20100101.

    
por 01.10.2015 / 02:30
1

versão do shell:

(while read l; do [ 'echo  $l | cut -d ' ' -f 2' -lt 20100101 ] && echo $l; done) < file
    
por 01.10.2015 / 13:02
0

Versão Java (requer o compilador java, pessoalmente eu uso openJDK)

Crie um arquivo *.java com o seguinte conteúdo:

import java.io.File;
import java.util.Scanner;
import java.io.IOException;

public class secondColumn
{
public static void main (String[] args) throws IOException
{
    File inpFile = new File (args[0]);
    Scanner scan = new Scanner(inpFile);
    String id = "";
    int num = 0;

    while (scan.hasNext())
        {

            id = scan.next();
            num = scan.nextInt();

    if ( num < 20100101  )
        System.out.println(id + " " + num);

        }

}

}

Compile e execute da seguinte forma:

xieerqi:$ javac secondColumn.java                                                                                          

xieerqi:$ java secondColumn inputFile.txt                                                                                  
id1 19501112
id2 19831207
1d3 20001212
id6 20000101
id10 20061213
id11 20081212
    
por 01.10.2015 / 08:08
0

Para o seu caso 2, isso pode ser feito no Bash, por exemplo, salve o arquivo abaixo como split :

#!/usr/bin/env bash

# Usage:     ./split 'data.txt' 'value'

paired=(  )
value="$2"

while read -a paired
do
    [[ ${paired[1]} < $value ]] && 
        echo "${paired[@]}" >> lessthan.txt ||
        echo "${paired[@]}" >> morethan.txt
done < "$1"

# end file

Observe que a variável emparelhada é uma matriz. Usando read -a paired lê cada linha em uma matriz de pares, baseada em zero, então o elemento 1 é o número de interesse em cada linha. O argumento 2 a split é o valor a ser usado para divisão.

Para o seu Caso 1, não tenho certeza do que você está querendo fazer, mas é possível modificar o acima para que, ao ler cada linha do arquivo, você possa enviar a coluna 1 ${paired[0]} ou coluna 2 ${paired[1]} para qualquer arquivo que você desejar, dependendo do valor da coluna 2.

    
por 06.10.2015 / 00:28