Element_query
Bir sorgunun sonucunu içeren bir dosya var :
SQL> select count (*) from element;
[Output of the query which I want to keep in my file]
SQL> spool off;
Shell komutunu kullanarak 1. satırı ve son satırı silmek istiyorum.
Element_query
Bir sorgunun sonucunu içeren bir dosya var :
SQL> select count (*) from element;
[Output of the query which I want to keep in my file]
SQL> spool off;
Shell komutunu kullanarak 1. satırı ve son satırı silmek istiyorum.
Yanıtlar:
GNU’yu kullanma sed
:
sed -i '1d;$d' Element_query
Nasıl çalışır :
-i
seçenek dosyayı kendisi düzenler. İsterseniz bu seçeneği kaldırabilir ve çıktıyı yeni bir dosyaya veya başka bir komuta yönlendirebilirsiniz.1d
ilk satırı siler ( 1
yalnızca ilk satırda hareket d
etmek, silmek için)$d
Son satırı siler (silmek $
için yalnızca son satırda hareket d
etmek)Daha ileri gidiyor:
1,5d
, ilk 5 satırı silerdi.SQL>
ifadeyi kullanmaya başlayan her satırı silebilirsiniz./^SQL> /d
/^$/d
statement1;statement2;satement3;...
) ayırarak veya komut satırında ( -e 'statement1' -e 'statement 2' ...
) ayrı olarak belirterek birleştirebilirsiniz.1,3d
ilk üç satırı siler), ancak son için biraz daha zor. Ne istediğine bağlı olarak, bunu kullanmaktan daha iyi olabilirsin: dosyada nerede olursa olsun sed -i '/^SQL> /d' Element_query
başlayan satırları silmek SQL>
.
sed
liner - bir dosyanın başından ve kuyruğundan rastgele satır sayımlarını sıyırmak için çalışacak , girdi normal bir dosya olduğu sürece, sadece iki head
işlem boyunca tek bir girişi gruplamak olsa da daha iyi - bu genellikle bunu yapmanın en hızlı yolu.
sed -i '1d' table-backup.sql
sql metin dosyasının ilk satırını silmek için kullanılır
{ head -n[num] >/dev/null
head -n[num]
} <infile >outfile
Yukarıdakiler ile, ilk head
komutla w / çıktının başından çıkarılacak ilk satır sayısını outfile
ve ikinci ile yazılacak satır sayısını belirleyebilirsiniz . Aynı zamanda bunu sed
, iki giriş gerektirmesine rağmen - özellikle girdi büyük olduğunda - olduğundan daha hızlı yapar . Nerede sed
kesinlikle olmalıdır olsa tercih edilebilir, durumda olduğunu <infile
olduğunu değil düzenli, lseekable bu genellikle olacak çünkü - Dosya değil bu durumda amaçlanan, ancak çalışma sed
tek metne süreçte tüm çıkış değişiklikleri işleyebilir.
Bir GNU ile head
kullanabileceğiniz -
negatif formunu [num]
ikinci komuta de. Bu durumda aşağıdaki komut girişten ilk ve son satırları çıkarır:
{ head -n1 >/dev/null
head -n-1
} <infile >outfile
sed
:Örneğin, 20 satırlık bir girdi okuyordum ve ilk 3 ve son 7'yi çıkarmak istedim. Bunu w / ile çözmem gerekirse sed
, bunu bir kuyruk tamponu ile yapardım. İlk önce on ile toplam şerit sayısı için üç ve yedi ekleyeceğim ve sonra yapacağım:
seq 20 | sed -ne:n -e '3d;N;1,10bn' -eP\;D
Bu, ilk 3 ve son 7 çizgiyi girişten çıkaran bir örnektir. Buradaki fikir, bir yığın üzerindeki desen uzayındaki giriş kuyruğundan sıyırmak istediğiniz kadar fazla satır tamponlayabilmeniz, ancak P
bunlardan ilkiyle çekilen her satır için işaretlemeniz olabilir.
1,10
sed
P
çünkü bir desen boşluk satır-satır giriş istifleme olan bu her biri için bir şey rints b
çiftlik döngü.sed
yığınlar d
elenir - ve böylece ilk 3 satır bir baskın halinde çıktıdan çıkarılır.sed
ulaştığında $
çekmek için giriş ve girişimi son hat N
ext bu EOF vurur ve tamamen işlem durur. Fakat o zaman desen uzayı, 14,20
hiçbiri henüz P
açılmayan ve asla olmadıkları tüm satırları içerir .sed
P
sadece ilk ortaya çıkan \n
ewline kadar işaret eder ve D
kalanlarla - veya sonraki 6 satırının girdiği yeni bir çevreye başlamadan önce aynı şeyi siler. 7. satır, N
yeni çevrimde ext komutu ile tekrar yığına eklenir .Ve böylece, seq
çıktısı (sırayla 20 numaralandırılmış 20 satırdır) , sed
yalnızca aşağıdakileri yazdırır:
4
5
6
7
8
9
10
11
12
13
Giriş kuyruğundan soymak istediğiniz satır sayısı büyük olduğunda bu sorunlu hale gelir - çünkü sed
performansı, desen alanının boyutuyla doğrudan orantılıdır. Yine de, birçok durumda uygulanabilir bir çözümdür - ve POSIX sed
, kırmadan önce en az 4 kb'lık işlemek için bir desen alanı belirler.
tail
da genişletilmiş destekler tail -n+<num>
"satırından başlatmak anlamına sözdizimi <num>
"
Birkaç satırı nasıl sileceğimi cevaplamayacağım. Soruna bu şekilde saldıracağım:
grep -v '#SQL>' Element_query >outfile
Satırları saymak yerine, istemleri tanıyarak SQL komutlarını ortadan kaldırır. Bu çözüm daha sonra iki oturumdan daha fazla komut içeren SQL oturumlarının diğer çıktı dosyaları için genelleştirilebilir.
ed
'standart metin editörü' dür ve GNU'su olmayan sistemlerde mevcut olmalıdır sed
. Başlangıçta bir metin editörü olarak tasarlandı, ancak komut dosyası yazmaya çok uygun.
printf '%s\n' 1d '$d' w q | ed Element_query
1d
Dosyanın ilk satırını siler $d
(kabuğun değişken olmadığını düşünmesi için alıntı yapılır) son satırı siler w
, dosyayı yazar ve q
çıkar ed
. printf
Burada komutları biçimlendirmek için kullanılır ed
- her birinin bir yeni satır izlemesi gerekir; Elbette bunu başarmanın başka yolları da var.
Öndeki ve sondaki çizgileri bir dosyadan kaldırmak için birkaç yol vardır.
Sen kullanabilirsiniz awk
o desen eşleştirme ve çizgi sayma hem kolları olarak,
#you need to know length to skip last line, assume we have 100 lines
awk 'NR>1 && NR<100 {print $0};' < inputfile
#or
awk '/SQL/ {next}; {print $0;};' < inputfile |awk 'NR>1&& NR<10 {print $0};'
İstediğiniz grep -v
çizgileri kalıba göre hariç tutmak için kullanabilirsiniz ve -E
seçeneği kullanarak birden çok kalıbı eşleştirebilirsiniz.
grep -v -E "SQL>" < inputfile > outputfile
Belirli satır sayısını kesmek için kullanabilir head
vetail
lines=$((`wc -l < inputfile`-2)) #how many lines in file, less 2
head -n-1 < inputfile | head -n$lines > outputfile
#or
tail -n+2 < inputfile | head -n$lines > outputfile
vi/vim
İlk ve son satırları kullanabilir ve silebilirsiniz,
vi inputfile
:1
dd
:$
dd
:w! outputfile
:x
Bir perl betiği kullanabilir, ilk satırı atlayabilir, her satırı kaydedebilir, bir sonraki satırı aldığınızda yazdırabilirsiniz.
#left as exercise for the reader :-)
head
aslında boruya ihtiyacınız yok ve aslında eğer ondan uzaklaşırsanız hiç kullanmamak daha iyidir. Siz yaptığınız zaman head | head
- iki işlem aynı anda çalışabilirken, ikisi de aynı veriyi pratik olarak gereksiz bir şekilde işliyorlar. Bunun yerine ne olursa { head >dump; head >save; } <in
yalnızca offset tarafından atlamak - ilk ortaya 10 satır okur >dump
ve ikinci okur sonraki dışarı 10 satır >save
.
SQL komutlarını keserek çok daha iyi hizmet edersiniz . Bunu iki yolla yapabilirsiniz:
Eğer varsa kesinlikle emin dizisi "o SQL>
" yok değil çıktıda başka bir yerde meydana,
grep -v -F 'SQL> ' < infile > outfile
Eğer emin değilseniz,
grep -v '^SQL> .*;$' < infile > outfile
İkinci versiyon daha yavaş ama daha doğru: "SQL>" ile başlayan ve ortadan kaldırılmasını istediğiniz satırları tanımlayan noktalı virgülle biten satırları yok sayacak.
Ancak, bu ekstra çıktının dosyaya başlamaması daha iyi olacaktır. Çoğu SQL sisteminin bunu yapmasının bir yolu vardır. Oracle ile fazla konuşmuyorum, ama belki bu cevap yardımcı olabilir.
Bir aralıktaki satırları seçebilirsiniz awk
(bu kaç satır olduğunu bildiğinizi varsayar):
awk 'NR>1 && NR < 3' file
Veya Perl'de:
perl -ne 'print if $.>1 && $.<3' file
Kaç tane satır olduğunu bilmiyorsanız, bunu kullanarak anında hesaplayabilirsiniz (bunun grep
boş satır saymayacağını unutmayın; grep -c '' file
bunları saymak için de kullanın ):
awk -vm="$(grep -c . file2.txt)" 'NR>1 && NR<m' file2.txt
Bu çözümü deneyin:
tail -n +2 name_of_file | head -n-1
Özelleştirme
Kolayca n ilk satırları değişen silmek için adapte edebilir +2
arasında tail
;
veya değişen son n satırları silmek -1
arasında head
.
Kullanarak awk
:
< inputfile awk 'NR>1 {print r}; {r=$0}' > outputfile
< inputfile
: İçeriğini yönlendirir inputfile
için awk
yıllardanstdin
> outputfile
: İçeriğini yönlendirir awk
sitesindeki stdout
içinoutputfile
NR>1
: aşağıdaki işlemleri yalnızca işlenmekte olan kaydın sayısı 1'den büyükse yürütür.{print r}
: değişkenin içeriğini yazdırır r
{r=$0}
: işlenmekte olan kaydın içeriğini değişkene atar r
Bu nedenle, awk
betiğin ilk yürütülmesinde , ilk eylem bloğu yürütülmez, ikinci eylem bloğu yürütülür ve kaydın içeriği değişkene atanır r
; ikinci uygulamada, ilk eylemler bloğu yürütülür ve değişkenin içeriği r
yazdırılır (böylece önceki kayıt basılır); Bunun, işlenen her satırın ancak birincisinin ve sonuncusunun yazdırılması etkisi vardır.
r
.