Selecione linhas com base nos valores de uma coluna específica (não na primeira coluna)

0

Eu gostaria de ler um arquivo file.csv e manter as linhas (ou seja, todas as colunas) do arquivo se e somente se a sexta coluna desse arquivo corresponder aos valores em user_ids_to_keep.csv .

O arquivo file.csv que gostaria de ler é o seguinte:

Year,WeekOfYear,DaysInWeek,USAIsBankHoliday,holidays,**user_id**       
2013,1,5,2,1,1       
2013,1,5,2,1,2       
2013,1,5,2,1,3       
, etc.

O user_ids_to_keep.csv do qual estou obtendo os IDs correspondentes lista os IDs da seguinte forma:

1    
3    
5    
, etc.    

O arquivo output.csv que gostaria de criar deve se parecer com o seguinte:

Year,WeekOfYear,DaysInWeek,USAIsBankHoliday,holidays,**user_id**       
2013,1,5,2,1,1       
2013,1,5,2,1,3       
,etc. 

Se a coluna user_id foi a primeira do arquivo file.csv, acredito que eu poderia ter usado o comando

grep -Fwf

mas agora não sei como contornar isso.

    
por Georgia2004 13.04.2016 / 05:17

2 respostas

0

Mostrar arquivos:

head *

... o que gera:

==> file.csv <==
Year,WeekOfYear,DaysInWeek,USAIsBankHoliday,holidays,**user_id**       
2013,1,5,2,1,1       
2013,1,5,2,1,2       
2013,1,5,2,1,3  

==> user_ids_to_keep.csv <==
1    
3    
5  

Código Ugley POSIX, (pode ser copiado como one-liner):

{ read x ; echo $x ; \
  while read x ; \
  do for f in 'cat user_ids_to_keep.csv' ; \
     do n=${x#${x%,*},} ; \
         if [ $n = $f ] ; \
         then echo $x ; \
              continue ; \
         fi ; \
     done ; \
  done ; } < file.csv | tee output.csv

Exibe:

Year,WeekOfYear,DaysInWeek,USAIsBankHoliday,holidays,**user_id**
2013,1,5,2,1,1
2013,1,5,2,1,3
    
por 13.04.2016 / 11:01
0

Pode ser escrito em uma linha:

paste -sd '' user_ids_to_keep.csv | sed 's/[ \t]*//' | xargs -i@ sed -n '/,[@][ \t]*$/p' file.csv

Descrição:

paste -sd '' user_ids_to_keep.csv

produzirá os dados do arquivo em uma linha sem novas linhas

sed 's/[ \t]*//'

excluirá todos os espaços da saída anterior

xargs -i@ sed -n '/,[@][ \t]*$/p' file.csv

usará a saída anterior na variável '@' como um padrão para comparar o final de cada linha do arquivo .csv e imprimi-lo se o padrão corresponder a

    
por 13.04.2016 / 13:00