Selecione o arquivo com base no número de linhas e manipule o resultado

1

Eu tenho um grande número de arquivos, todos com o mesmo formato.

line 1: Gene ID
line 2: chromosomal position
line 3 - x: names of genetic variants)

Eu quero selecionar apenas arquivos contendo pelo menos 5 variantes (ou seja, arquivos que tenham pelo menos 10 linhas no total). Se um arquivo tiver pelo menos 5 variantes, desejo gravar o conteúdo menos as duas primeiras linhas em um novo arquivo. Abaixo, forneço dois arquivos de entrada de exemplo, foo1 e foo2 .

foo1:

echo {885743,4:139381:3783883,rs93487,rs82727,rs111} | tr " " "\n" > foo1

foo2:

echo {10432,1:3747548:2192993,rs10204,rs262222,rs436363,rs3636,rs9878,rs11856} | tr " " "\n" > foo2

Arquivo de saída desejado (neste caso, apenas 1 arquivo, na realidade, haverá vários arquivos de saída separados): foo2.checked , parecido com:

rs10204
rs262222
rs436363
rs3636
rs9878
rs11856
    
por mats 08.09.2015 / 15:24

2 respostas

1
 # for each file in the current directory you can refine the ls command to match 
 # only the files you want. or if in a script file pass in the file list 
 for file in *
 do
    # if the file has more than 10 lines.
    if (( $(<"${file}" wc -l) > 10 )); then
       # print line 3 to end of file and pipe it to a file with the same
       # name as the input file with the added .checked at the end.
       sed -n '3,$p' -- "${file}" > "${file}.checked"
    fi
 done
    
por 08.09.2015 / 15:48
2

assumindo nenhum arquivo com caractere engraçado em seu nome

 for file in *
 do
    line=$(wc -l < "$file' )
    if [ $line -ge 10 ]
    then
       tail -n +3 <"$file" > "${file}.checked"
    fi
 done

isso basicamente conta a linha em todos os arquivos, então, se tiver mais de 10, imprima todas as linhas, começando na terceira.

    
por 08.09.2015 / 15:32