2012-10-22 10 views
5

Mam bardzo duży plik, z którego muszę usunąć konkretną linię (numer linii 941573)Jak usunąć konkretną linię z pliku w systemie UNIX?

Jestem trochę nowy w tym środowisku, ale szukałem go bezskutecznie.

Próbowałem przy użyciu polecenia sed jako takich, ale nie wydaje się działać

sed -e '941572,941574d' filenameX > newfilenameY 

Próbowałem zostały również

sed -e '941573d' filenameX > newfilenameY 

Jeszcze pliku '' i newfilenameY oryginalny plik "nazwa_pliku_FX" nadal zawiera wiersz, który próbuję usunąć. Jest to plik fastq, chociaż nie widzę, jak to by miało znaczenie. Tak jak powiedziałem, jestem nowy w systemie uniksowym, więc może dostałem polecenie sed niewłaściwe

+0

Właśnie próbowałem tego podejścia (z dużo mniejszym plikiem) i wszystko wydaje się działać. Być może chcesz ponownie sprawdzić? –

+0

Mam, kilka razy –

+0

Proponuję uruchomić 'sed -ne '941573p' filenameX', aby zobaczyć, czy sed liczy numery linii w sposób, w jaki tego oczekujesz. –

Odpowiedz

6

d usuwa linię/linie. Twoje drugie podejście działa.

$ sed '941573d' input > output 

Długi Przykład:

% for i in $(seq 1000000) 
do 
echo i >> input 
done 
% wc -l input 
1000000 input 
% sed '941573d' input > output 
% wc -l output 
999999 output 
% diff -u input output          :(
--- input  2012-10-22 13:22:41.404395295 +0200 
+++ output  2012-10-22 13:22:43.400395358 +0200 
@@ -941570,7 +941570,6 @@ 
941570 
941571 
941572 
-941573 
941574 
941575 
941576 

Krótki przykład:

% cat input 
foo 
bar 
baz 
qux 
% sed '3d' input > output 
% cat output    
foo 
bar 
qux 
+2

Czym różni się to od tego, co robi OP poza esem, który (jak sądzę) nie powinien mieć znaczenia? –

+0

@BrianAgnew Nie ma różnicy. Drugie podejście działania OP. –

+0

To właśnie myślałem –

0

Oto jak usunąć jedną lub więcej linii z pliku.

Składnia:

sed '{[/]<n>|<string>|<regex>[/]}d' <fileName>  
sed '{[/]<adr1>[,<adr2>][/]d' <fileName> 
/.../=delimiters 
n = line number 
string = string found in in line 
regex = regular expression corresponding to the searched pattern 
addr = address of a line (number or pattern) 
d = delete 
0

I wygenerowany plik testowy z 1000000 linii i próbował swoją sed -e '941573d' filenameX > newfilenameY i to działało dobrze na Linuksie.

Może mamy inne nieporozumienie. Numery linii liczą się od jednego, a nie od zera. Jeśli policzysz od zera, to znaczy, że brakuje linii 941572.

Czy próbowałeś diff filenameX newfilenameY? Oznaczałoby to wszelkie nieoczekiwane zmiany.

Nie wiem zbyt wiele na temat formatu FASTQ, ale czy jesteś pewny, że mówimy o numerach linii pliku tekstowego, a nie o numerach sekwencji?

Istnieje ogólny limit długości linii wynoszący 4096 bajtów, czy którakolwiek z linii przekracza tę wartość? (To mało prawdopodobne, ale pomyślałem, że warto na to pytanie).

Powiązane problemy