2009-08-13 14 views
47

Potrzebuję edytować kilka plików tekstowych (dane wyjściowe z sar) i przekonwertować je do plików CSV.Zastąp odstępy przecinkiem w pliku tekstowym w systemie Linux

Potrzebuję zmienić wszystkie spacje (może to tabulacja między liczbami na wyjściu) za pomocą funkcji sed lub awk (prosty skrypt powłoki w systemie Linux).

Czy ktoś może mi pomóc? Każde użyte polecenie w ogóle nie zmieniło pliku; Próbowałem gsub.

Odpowiedz

19

nie patrząc na pliku wejściowego, tylko przypuszczenie

awk '{$1=$1}1' OFS="," 

przekierować do innego pliku i zmienić w zależności od potrzeb

+0

Zakładam ostateczną 1 po zamknięciu nawias klamrowy jest zawsze prawdziwy wzór, który drukuje linię? Poszedłbym z bardziej czytelnym '{$ 1 = $ 1; print} '. – tzot

+0

tak. jest to idiom awk dla prawdziwego stanu, który domyślnie drukuje na stdout. – ghostdog74

8

Co o coś takiego:

cat texte.txt | sed -e 's/\s/,/g' > texte-new.txt 

(Tak, z pewnymi bezużytecznymi kotlinami i rurociągami, może również użyć < do bezpośredniego odczytu z pliku, jak przypuszczam - użył najpierw kota, aby wypisać zawartość pliku, a dopiero potem dodałem sed do mojego wiersza poleceń)

EDIT: jak @ ghostdog74 zauważył w komentarzu, jest zdecydowanie nie ma potrzeby Thet cat/rury; można podać nazwę pliku do sed:

sed -e 's/\s/,/g' texte.txt > texte-new.txt 

Jeśli "texte.txt" to w ten sposób:

$ cat texte.txt 
this is a text 
in which I want to replace 
spaces by commas 

Dostaniesz "Texte-new.txt", że będzie wyglądać tak:

$ cat texte-new.txt 
this,is,a,text 
in,which,I,want,to,replace 
spaces,by,commas 

nie pojadę tylko zastępując stary plik przez nowy (można zrobić z sed -i, jeśli dobrze pamiętam, a jak @ ghostdog74 powiedział ten przyjąłby tworzenie kopii zapasowej w locie): prowadzenie może być mądry, jako środek bezpieczeństwa (nawet jeśli oznacza to konieczności zmień go na coś w stylu "Texte-backup.txt")

+1

nie trzeba kota. sed -e 's/\ s /,/g' teste.txt. Ponadto, jeśli używasz GNU sed, możesz użyć -i.bak – ghostdog74

+1

Tak, edytowałem swoją odpowiedź podczas pisania twojego komentarza, aby powiedzieć o -i (mimo, że nie polecałbym go używać, aby zachować kopię zapasową plik - który zawsze może być przydatny); nie myślałem o sed myfile.txt; dobry punkt, dzięki! –

6

Polecenie to powinno działać:

sed "s/\s/,/g" <infile.txt> outfile.txt 

Note że musisz przekierować wyjście do nowego pliku. Plik wejściowy nie został zmieniony w miejscu.

5

sed może to zrobić:

sed 's/[\t ]/,/g' input.file 

że wyśle ​​do konsoli

sed -i 's/[\t ]/,/g' input.file 

będzie edytować plik w miejscu

26

spróbować czegoś takiego:

sed 's/[:space:]+/,/g' orig.txt > modified.txt 

Postać class [: space:] dopasuje wszystkie spacje (spacje, tabulatory itp.). Jeśli chcesz tylko zastąpić pojedynczy znak, np. tylko przestrzeń, użyj tylko tego.

EDYCJA: W rzeczywistości [: spacja:] zawiera powrót karetki, więc to może nie zrobić, co chcesz. Następujące elementy zastąpią tabulatory i spacje.

sed 's/[:blank:]+/,/g' orig.txt > modified.txt 

jak będzie

sed 's/[\t ]+/,/g' orig.txt > modified.txt 

W tym wszystkim, trzeba być ostrożnym, że elementy w pliku, które są oddzielone spacją nie zawierają własne białe znaki, które chcesz zachować, na przykład. dwa słowa.

+0

nie jest narzędziem zorientowanym liniowo? Jeśli tak, to nie powinno to mieć znaczenia, że ​​\ n jest zawarte w [: space:] –

+11

GNU sed wymaga następującej składni: sed 's/[[: space:]] \ + /,/g' filename –

+0

@glennjackman thanks that worked ! i uzupełniając twój komentarz, używam '-r', więc' sed -r 's' [[: blank:]] + ',' g '' –

67
tr ' ' ',' <input >output 

Zamienniki każda przestrzeń z przecinkiem, jeśli trzeba można złożyć podanie z flagą -s (powtórzeń wyciskania), która zastępuje każdą sekwencję wejściową powtarzającego się charakteru, który jest wymieniony w Set1 (puste miejsce) z jednym wystąpieniem tego znaku.

Korzystanie z powtórzeniami ściskających wykorzystywanych do po zakładkach zastępczych:

tr -s '\t' <input | tr '\t' ',' >output 
+4

Nie znam jednak powodu ta metoda używająca "tr" działa dla mojej sprawy. Zarówno sed, jak i awk nie radziły sobie z pustymi miejscami w moim pliku, które zostały wygenerowane przez program Java. – Leo5188

+0

Awesome one tr '' ',' ...działa dla mnie dzięki –

3

Oto skrypt Perl, który będzie edytować pliki w miejscu:

perl -i.bak -lpe 's/\s+/,/g' files* 

konsekutywne spacja jest konwertowana na jednym przecinkiem.
Każdy plik wejściowy jest przenoszony do bak

wykorzystywane są te opcje wiersza polecenia:

  • -i.bak edycji w miejscu i sprawiają bak kopie

  • -p pętlę wokół każdej linii plik wejściowy, automatycznie drukuje linię

  • -l usuwa nowe linie przed przetworzeniem i dodaje je w później

  • -e wykonać kod perla

Powiązane problemy