Selecione o intervalo particular de campos de um arquivo de texto

1

Eu tenho um arquivo de texto filenr.lis contém

#  1  2016-05-31-1003-57S._BKSR_003_CM6
#  2  2016-06-01-2255-54S._BKSR_003_CM6
#  3  2016-06-05-1624-57S._BKSR_003_CM6
#  4  2016-06-07-1914-55S._BKSR_003_CM6
.
.
.

e assim por diante

E minha saída deve gostar

2016-05-31-10-03
2016-06-01-22-55
2016-06-01-22-55
2016-06-07-19-14

Obrigado!

    
por Preet 26.01.2017 / 18:46

3 respostas

4

awk

awk '{print substr($3,0,13)"-"substr($3,14,2)}' file.txt
2016-05-31-10-03
2016-06-01-22-55
2016-06-05-16-24
2016-06-07-19-14

sed

sed 's/^......\(.............\)\(..\).*/-/' file.txt

sed, mas um pouco mais inteligente

sed 's/^.\{6\}\(.\{13\}\)\(..\).*/-/' file.txt

perl

perl -pe 's/^.{6}(.{13})(..).*/$1-$2/' file.txt
    
por 26.01.2017 / 21:25
1

Solução de corte baseada em colunas fixas - tamanho fixo - posição de caractere fixo:

$ cut --output-delimiter='-' -c7-19,20-21 file.txt
# display from char 7 up to 19, then print output delimiter, then display from char 20 up to char 21.

Solução de bash:

$ while IFS= read -r line;do line="${line:6:13}-${line:14:2}";echo $line;done<file.txt

Solução baseada em campos e não em caracteres:

while IFS= read -r line;do 
  line=$(cut -d' ' -f5- <<<"$line") #with space delimiter get field 5 up to the end
  line=$(cut -d- -f1-4 <<<"$line") #with delimiter="-" get field 1 up to 4
  line=$(sed "s/${line: -2}/-${line: -2}/g" <<<"$line") #insert a dash before last two characters
  echo "$line"
done<file

Como one-liner com substituição de processo:

$ sed 's/..$/-
$ cut --output-delimiter='-' -c7-19,20-21 file.txt
# display from char 7 up to 19, then print output delimiter, then display from char 20 up to char 21.
/g' <(cut -d- -f1-4 <(cut -d" " -f5- file.txt)) #use >newfile at the end to send the results to a new file

Em todos os casos, o resultado é o esperado, considerando o seu arquivo de entrada (e incluindo # 1 no início de cada linha)

    
por 26.01.2017 / 19:01
1

Pessoalmente, gosto da solução awk da melhor forma, mas aqui está outra maneira

cat FILE_NAME | tr -s ' ' | cut -d' ' -f3 | cut -b 1-13

    
por 29.01.2017 / 05:54