Çeşitli çıktı dosyalarına gitmek için stdout nasıl bölünür?


12

Diyelim ki commandstdout'a çok sayıda satır basan bir komutum var:

line1
line2
.....
lineN

Çıktı diske kaydetmek istiyorum, ama tek bir dosya olarak değil, her 1000 satır stdout sahip bir dosya sırası olarak:

file0001.txt:
-------------
line1
....
line1000

file0002.txt:
-------------
line1001
....
line2000

etc

Cevabı google'da denemeye çalıştım, ancak google beni her zaman teekomuta yönlendirdi, bu durumda işe yaramaz. Muhtemelen yanlış sorgular giriyorum.

Yanıtlar:


24

Dosyayı kaydetmeyi tamamladıktan sonra, dosyayı her zaman splitsatır sayısına göre dosya parçalarına veya birden çok dosyaya dönüştürebilirsiniz.

split -l 1000 output_file

ya da daha iyisi sadece dene

command | split -l 1000 -

Bu, çıkış akışını her 1000 satırlı dosyalara böler (varsayılan, -l seçeneği olmayan 1000 satırdır).

Aşağıdaki komut, çıktı oluşturulduğunda ve dosyaya depolamak için ayrıldığında oluşturulacak dosya adına bir önek koymak veya uygulamak için ek esneklik sağlar.

command | split -l 1000 - small-


Kafam karıştı, bu yüzden diğerleri split [arguments...] [input e.g. "-" for stdin] [output_prefix]için, örneğin: 001, 002 ans tar -c somedir | split --byes 100MB --numeric-suffixes --suffix-length=3 - somedir.tar.part-adlı 100MB dosyadan oluşan bir demet çıktı somedir.tar.part-000.
ThorSummoner

3

Bir bash betiği kullanabilirsiniz lines.bash

#!/bin/bash
a=0
while IFS='' read -r line
do
  printf -v filename "%04d.txt" "$((a++/1000))"
  echo "$line" >> $filename
done

ve şu şekilde kullanın:

cat long_file.txt | bash lines.bash

Ben fark tek sorun *oturum açma ile long_file.txt(birisi düzeltebilir).


2
IFSKelimenin bölünmesini önlemek için boş dizeyi ayarlayın read. -rTers eğik çizgi çıkışını devre dışı bırakmak için kullanın read. -eTers eğik çizginin kaçmasını önlemek için çıkartın echo. Kelimenin bölünmesini önlemek için tırnak işareti kullanın echo. Kullanım -viçinde bashbir alt işlemine başlamadan önlemek için yana 4.0. Geçerli kodunuz ilk dosyaya yalnızca 999 satır koyacağından artım sonrası kullanın. a=0; while IFS='' read -r line; do printf -v filename "%04d.txt" $((a++/1000)); echo "$line" >> "$filename"; done
manatwork

@manatwork Teşekkür ederim. Sadece benim printfyok -vanahtarı. ( bash 4.2.10). En azındanprintf
xralf

1
man printfHayatta asla bir ortam değişkeni ayarlayamayan belgeler / usr / bin / printf. Bkz help printfiçin printfyerleşik kabuk belgelerine.
manatwork

@manatwork Tamam. Parçada ++/henüz sözdizimi hatası var gibi görünüyor .
xralf

1
Bir şey daha var: açıkça parametre genişlemesine ihtiyacınız olmadıkça, aritmetik değerlendirme içinde sigil kullanmaya gerek yoktur. Aritmetik genişlemede değişkenler yine de değerlendirilir.
manatwork
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.