Analizowanie pliku .txt w celu wygenerowania pliku .csv

1

Mam plik tekstowy z następującą zawartością

Torrent file  : Linux.Format.-.October.2016.-.True.Pdf.-.Set.1001.[ECLiPSE].torrent
Metadata info : 9968 bytes, 412 pieces, 65536 bytes per piece
Torrent name  : Linux Format - October 2016 - True Pdf - Set 1001 [ECLiPSE]
Content info  : 3 files, 26965176 bytes
Announce URL  : http://explodie.org:6969/announce

F#  Bytes       File name
--- ----------- ---------------------------------------------------------------
  1    26944026 linfor1016.pdf
  2       19963 ECLiPSE.txt
  3        1187 Read Me.txt

Torrent file  : linuxmint-13-cinnamon-dvd-64bit.iso.torrent
Metadata info : 32303 bytes, 1602 pieces, 524288 bytes per piece
Torrent name  : linuxmint-13-cinnamon-dvd-64bit.iso
Content info  : single file, 839909376 bytes
Announce URL  : http://torrents.linuxmint.com/announce.php
Torrent file  : linuxmint-13-kde-dvd-64bit.iso.torrent
Metadata info : 35938 bytes, 1784 pieces, 524288 bytes per piece
Torrent name  : linuxmint-13-kde-dvd-64bit.iso
Content info  : single file, 935329792 bytes
Announce URL  : http://torrents.linuxmint.com/announce.php

plik jest generowany przez

for i in *.torrent;do torrentcheck -t $i >> info.txt;done

Teraz chcę przekonwertować ten plik txt tak, że dostaję plik CSV z dwóch kolumn , a mianowicie Torrent pliku i informacją Content (jako nagłówków) dla każdego pliku torrent analizowany za pomocą powyższego polecenia bash jak:

Torrent file,Content info 
Linux.Format.-.October.2016.-.True.Pdf.-.Set.1001.[ECLiPSE].torrent,3 files, 26965176 bytes
linuxmint-13-cinnamon-dvd-64bit.iso.torrent,single file, 839909376 bytes
linuxmint-13-kde-dvd-64bit.iso.torrent,single file, 935329792 bytes

kolumny mogą być następnie przetwarzane w dowolnej aplikacji Arkusz kalkulacyjny w celu sortowania torrentów według ich wielkości lub liczby zawartych w nich plików ...

Mogę wyszukiwać ciągi plików takie jak

grep 'Torrent file' info.txt or grep 'Content' info.txt

ale jak grać ze zwrotnymi ciągami tekstowymi, aby wyodrębnić wymagane informacje, np. jeśli otrzymam Torrent file : linuxmint-13-cinnamon-dvd-64bit.iso.torrent, mogę użyć poleceń MID, LEN arkusza kalkulacyjnego, aby zredukować ciąg dolinuxmint-13-cinnamon-dvd-64bit.iso.torrent

Nightcrawler
źródło

Odpowiedzi:

2

Prosty skrypt awk może analizować dane, np .:

awk -F': ' 'BEGIN { print "Torrent file,Content info,Size" }
$0~/^Torrent file/ { save = $2 }
$0~/^Content info/ { printf "%s,%s\n",save,$2 }'  <info.txt

Podziel linie na „:”, zapisz 2. pole jednego wiersza, wydrukuj go później, gdy zostanie znaleziony drugi wiersz.

meuh
źródło
Możesz to przekształcić w „oneliner” alaecho "Torrent file,Content info" > info.csv && cat info.txt | awk -F': ' '$1=="Torrent file " { save = $2 } $1=="Content info " { printf "%s,%s\n",save,$2 }' >> info.csv
FCTW
dziękuję za odpowiedź, jednak twoje rozwiązanie oneliner wyświetla tylko pierwszy wiersz, który jest Torrent file,Content infoniczym innym .. Uruchamiam twoje polecenie po cd'owaniu do katalogu zawierającego info.txt
nightcrawler
@nightcrawler Zredagowałem swoją odpowiedź, aby była mniej wybredna z liczbą spacji przed „:” i zaczynam od nagłówka kolumny. Być może to pomaga. W tym wzorze TTorrent musi być pierwszym znakiem w linii, na przykład bez spacji.
Meuh
Nie wiem, czy to moja samotna walka ... ale twoja oryginalna odpowiedź (oddzielne linie) zadziałała ... i majsterkowanie w końcu mam to do pracyecho "Torrent file,Content info" > info.csv && cat info.txt | awk -F': ' ' $1=="Torrent file " { save = $2 } $1=="Content info " { printf "%s,%s\n",save,$2 }' >> info.csv
Nightcrawler