Mover arquivos / tabelas seguindo os critérios de seleção

2

Considerando uma variável a que descreve as séries de temperatura da cidade a . Eu tenho 9 diretórios ( a1 , a2 , a3 , a4 , a5 , a6 , a7 , a8 , a9 ) cada um deles contendo uma tabela (respectivamente a1.txt , a2.txt , a3.txt , a4.txt , a5.txt , a6.txt , a7.txt , a8.txt , a9.txt ).

Eu gostaria de mover para outro diretório a tabela que apresenta o maior valor na primeira linha e na quarta coluna (com o separador de espaço). Alguém sabe como fazer isso?

    
por steve 09.11.2015 / 18:15

4 respostas

1

Este não deve ser um site "escreva este programa para mim", por isso estou assumindo que você não tem idéia de por onde começar. Então aqui está uma maneira:

#!/bin/bash
highest=-999
for x in a[0-9]/a[0-9].txt;do
    fourth="$(awk 'NR==1{print $4}' $x)"
    if [ $highest -lt $fourth ];then
        highest=$fourth
        hifile=$x
    fi
done
echo "highest was $highest in $hifile"
mv $hifile high/

Um resumo do que o código acima faz: percorre todas as combinações de diretório / arquivo denominadas a[0-9]/a[0-9].txt ele usa awk para designar o quarto campo ( {print $4} ) da primeira linha ( NR==1 ) para a variável quarto. Em seguida, compara se o valor mais alto for menor que o quarto ( if [ $highest -lt $fourth ];then ) e, se for o caso, salvará o nome do arquivo na variável hifile. Quando o loop é feito, ele move o arquivo para o diretório "high"

    
por 09.11.2015 / 19:18
2

Isso é o que eu usei para gerar os arquivos dos quais você está falando:

mkdir -p       another/directory
for   n in     1 2 3 4 5 6 7 8 9
do    mkdir   -p "a$n"
      printf  "$n $n $n 1$n $n $n $n $n\n" >"a$n/a$n.txt"   #1 marks 4th col
done

Isso é o que eu usei para mv o arquivo:

 mv "a$(((a=$(t=$(printf \t)
 paste a[1-9]/a[1-9].txt /dev/null |
 sed -e"s/\( *[^ ][^ ]*[ $t]\)\{4\}[^$t]*//g;y| |\n|;q" |
 sort -rn | head -n1))-10))/a${a#1}.txt" another/directory

E isso é o que eu fiz para verificar se estava certo:

cat another/directory/*
9 9 9 19 9 9 9 9

... mas eu não entendi direito. Isso depende do valor mais alto que corresponde ao nome do arquivo. Isso não acontece:

file=$(
    grep -n . ./a[1-9]/a[1-9].txt |
    grep :1: |     cut -d\  -f1,4 |
    sort -rnk2,2
)
mv "${file%%:*}" another/directory
    
por 09.11.2015 / 19:42
1

Há mais de uma maneira de fazer isso, é claro, mas aqui está uma maneira:

#!/bin/bash

# start out assuming 1 is the highest
highfile=a1/a1.txt
highval=$(head -1 a1/a1.txt | awk '{print $4}')
for a in 'seq 2 9'
do
  val=$(head -1 a$a/a$a.txt | awk '{print $4}')
  if [ $val -gt $highval ]
  then
    highfile=a$a/a$a.txt
    highval=$val
  fi
done

echo mv $highfile destdir
    
por 09.11.2015 / 19:22
1

É uma brisa com gawk

awk -v target_dir="$TARGET_DIR" '
  {a[FILENAME] = $4; nextfile}; 
  END{PROCINFO["sorted_in"]="@val_num_desc";
  for(k in a){system("mv "k" "target_dir); exit}}' */*.txt
    
por 10.11.2015 / 06:51

Tags