Her 100 satırda bir büyük txt dosyasını bölme ve orijinal başlık dahil (bir Mac'te)


1

Satır 5'ten sayılan her 100 satıra daha büyük bir metin dosyasını bölen (ilk 4 başlık satırlarıdır) ve orijinal başlık içeren tek tek .txt dosyaları çıkaran bir araç veya komut dosyası (Textwrangler veya Terminal) arıyorum.

Örneğin

giriş:

File.txt
line1 / line4   HEADER
...
line5 / line265 DATA

çıktı:

File_01.txt
line1/line4   HEADER
line5/line104 DATA

File_02.txt
line1/line4   HEADER
line5/line104 DATA

File_03.txt
line1/line4   HEADER
line5/line65  DATA

Metin dosyası, önemli olması durumunda Windows satır sonlarını (CR LF) kullanır.

Şu anda bunu manuel olarak yapıyorum, bu yüzden bu süreci daha verimli hale getirebilecek önerileriniz memnuniyetle karşılanıyor.

Yanıtlar:


5
  1. Başlığı çıkarın ve ayrı bir dosyaya yerleştirin header.txt.
  2. verileri kullanarak bölünsplit --lines=100 data.txt (bu, her biri xaa xab xac ve benzeri adında 100 satırlık çok sayıda dosya oluşturur)
  3. Ardından başlığı her bir dosyaya hazırlayın for a in x??; do cat header.txt $a > $a.txt; doneBu, bitmiş veri dosyalarınızın (başlıklar ile birlikte) çağrılmasıyla sonuçlanır.xaa.txt xab.txt xac.txt ...

Veri miktarı çok büyükse (veya daha az satıra bölerseniz), xxx dosyaları yeterince bölünmezse, dosya adında dört harf oluşturur. Bu durumda ?, foryukarıdaki bölüme bir ekstra ekleyin .

Düzenleme: İlk dört satırı çıkarmak için
başlık kullanımı çıkarımını otomatikleştirmek için head -4 origdata.txt > header.txt. tail -n +4 origdata.txt > data.txtİlk dört satır dışındaki her şeyi çıkarmak için kullanın . Şimdi, biri başlığa, diğeri veri içeren iki dosyaya sahipsiniz. Bunu bir komut dosyası ile birleştirmek çok zor olmamalı. (Bugün bash'a erişimim yok)


Teşekkürler! "-L 100" yerine "--lines = 100" yerine yazmam gerekti, ancak bunun dışında bir cazibe gibi çalışıyor. Ancak ideal olarak, işi yapmak için bir komut dosyasını veya tek satırlık bir komutu tercih ederdim, bu yüzden (daha az bilgisayar bilgisine sahip) çalışanların benim yokluğumda bu görevleri üstlenmeleri daha kolaydır.
Dan

@Dan - Her şeyi biraz karışıklıkla yazılmış bir komut dosyasına koyabilirsiniz. İlk kısmı otomatikleştirmek için düzenlememe bakın.
Nifle

Önerilerinizi bir komut dosyasında derlemeyi başardım. Ayrıca orijinal dosya adını çıktıya dahil etmek için birkaç değişken tanımladım. Muhtemelen bu konuda oldukça yeni olduğum için birkaç komut dosyası sahte pas içeriyor ama hile oldukça güzel yapar. Tekrar teşekkürler!
Dan

3

Nifle tarafından verilen cevaba dayanarak, önerdiği komutları uygulayan, çıktıya orijinal dosya adını ekleyen ve geçici dosyaları temizleyen bir senaryo hazırladım.

#!/bin/bash

FILE=$(ls -1 | grep filename.txt)
NAME=${FILE%%.txt}

head -4 $FILE > header.txt
tail -n +5 $FILE > data.txt

split -l 100 data.txt

for a in x??
    do
        cat header.txt $a > $NAME.$a.txt
    done

mv $FILE $NAME.orig.txt
rm header.txt data.txt x??

Ve işte!

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.