Chcę wydrukować nieparzyste i parzyste linie z plików.
Znalazłem ten skrypt powłoki, który wykorzystuje echo.
#!/bin/bash
# Write a shell script that, given a file name as the argument will write
# the even numbered line to a file with name evenfile and odd numbered lines
# in a text file called oddfile.
# -------------------------------------------------------------------------
# Copyright (c) 2001 nixCraft project <http://cyberciti.biz/fb/>
# This script is licensed under GNU GPL version 2.0 or above
# -------------------------------------------------------------------------
# This script is part of nixCraft shell script collection (NSSC)
# Visit http://bash.cyberciti.biz/ for more information.
# -------------------------------------------------------------------------
file=$1
counter=0
eout="evenfile.$$" # even file name
oout="oddfile.$$" # odd file name
if [ $# -eq 0 ]
then
echo "$(basename $0) file"
exit 1
fi
if [ ! -f $file ]
then
echo "$file not a file"
exit 2
fi
while read line
do
# find out odd or even line number
isEvenNo=$( expr $counter % 2 )
if [ $isEvenNo -ne 0 ]
then
# even match
echo $line >> $eout
else
# odd match
echo $line >> $oout
fi
# increase counter by 1
(( counter ++ ))
done < $file
echo "Even file - $eout"
echo "Odd file - $oout"
Ale czy nie ma sposobu, aby to zrobić w jednym wierszu?
Tak, używam awk, czytam.
Linie parzyste:
awk 'NR % 2' filename
linie nieparzyste:
awk 'NR % 2 == 1' filename
Ale to nie działa dla mnie. Oba wytwarzają tę samą moc wyjściową, zgodnie z różnicą. W porównaniu do oryginalnego pliku oba są rzeczywiście o połowę dłuższe i oba zawierają wiersze o nieparzystych numerach. czy robię coś źle?
text-processing
sed
awk
ixtmixilix
źródło
źródło
NR % 2 == 0
, w przeciwnym razie jest równoważna drugiej.Odpowiedzi:
Jak zapytałeś „w jednej linii”:
Zauważ, że większość kodu wynika z twojego fantazyjnego wyboru nazwy pliku wyjściowego. W przeciwnym razie następujący kod wystarczyłby, aby wstawić nieparzyste linie w „linii-1”, a nawet linie w „linii-0”:
źródło
W miarę możliwości wolę być zgodny z POSIX, więc pomyślałem, że opublikuję tę alternatywną metodę. Często używam ich do zmieniania tekstu przed
xargs
potokami.Drukuj linie parzyste,
Drukuj linie nieparzyste,
Chociaż często używam
awk
, dla tego typu zadań jest to przesada.źródło
To łatwe:
wypisze linie parzyste z nazwy pliku
wypisze linie nieparzyste.
źródło
awk
, osobiście używam go bardzo często. Nigdy nie mówiłem, że coś jest „nie POSIX”awk
, miałem na myślised
opcje odpowiedzi . W szczególności~
operator, jest to rozszerzenie GNU, które nadal jest akceptowalne dla wielu osób. Jeśli chodzi o „używanie AWK z zewnątrz, I personally believe using
awk” do tego prostego zadania, to przesada. Tak więc +1 służyło do wykonania zadania przysed
użyciu lżejszego narzędzia niżawk
.W przypadku liczb parzystych kod powinien być
i dla liczb nieparzystych
źródło
gawk 'FS=",";NF%2==0' file.csv
.Możesz to zrobić za pomocą pojedynczego
sed
wywołania, nie musisz dwa razy czytać pliku:lub, jeśli wolisz w jednym wierszu:
Zauważ, że nie dadzą one oczekiwanego rezultatu, jeśli plik zawiera tylko jedną linię (linia zostanie
w
przekreślonaeven
zamiast,odd
ponieważ pierwszan
nie zostanie wykonana). Aby tego uniknąć, dodaj warunek:Jak to działa ? Cóż, używa trzech
sed
poleceń:n
- jeśli nie w ostatnim wierszu, wypisz obszar wzorców dostdout
(który jest przekierowany do plikuodd
), zamień go na następny wiersz (teraz przetwarza linię parzystą) i kontynuuj wykonywanie pozostałych poleceńw
- dołącz przestrzeń wzorów do plikueven
d
- usuń bieżącą przestrzeń wzorów i uruchom ponownie cykl - efektem ubocznym jest to, żesed
nigdy nie wydrukuje automatycznie obszaru wzorów, ponieważ nigdy nie osiągnie końca skryptuInnymi słowy,
n
jest wykonywany tylko na liniach nieparzystychw
id
jest wykonywany tylko na liniach parzystych.sed
nigdy nie drukuje się automatycznie, chyba że, jak powiedziałem, dane wejściowe składają się z jednej linii.źródło
Spróbuj tego:
źródło
Wybrałbym,
perl
bo lubięperl
:Wykorzystuje fakt, że
-p
niejawnie się drukuje, aby zreplikować sposóbsed
działania - i myselect
wybieramy uchwyt pliku, do którego zapisuje.źródło