
#! /bin/bash
for (( l = 1 ; l <= 50; ++l )) ; do
for (( k = 1 ; k <= 1000; ++k )) ; do
sed -n '$l,$lp' $k.dat >> ~/Escritorio/$l.txt
done
done
Das Skript befindet sich zusammen mit 1000 DAT-Dateien mit jeweils 50 Textzeilen in einem Ordner.
Die dat-Dateien heißen 1.dat
, 2.dat
,....,1000.dat
Mein Ziel besteht darin, Dateien zu erstellen l.txt
, in denen l.txt
die L-Zeile von 1.dat
, die L-Zeile von 2.dat
usw. steht. Dazu verwende ich den sed
Befehl, um die L-Datei jeder DAT-Datei auszuwählen.
Aber wenn ich das obige Skript ausführe, ist in der erstellten TXT-Datei nichts enthalten ...
Wo liegt der Fehler?
Antwort1
for LINE in {1..50}; do
for FILE in {1..1000}; do
sed -n "${LINE}p" "${FILE}.dat" >>"~/Escritorio/${LINE}.dat"
done
done
In Ihrem Skript verwenden Sie einfache Anführungszeichen für den sed-Ausdruck. Variablen werden in einfachen Anführungszeichen nicht erweitert, Sie müssen doppelte Anführungszeichen verwenden.
Außerdem gibt es einen Einzeiler mit awk, der dasselbe kann:
awk 'FNR<=50 {filename=sprintf("results/%d.dat", FNR); print >> filename; close(filename)}' *.dat
Erstellen Sie einfach das Ergebnisverzeichnis oder ändern Sie es im Befehl in ein anderes, da es ~
dort nicht nach Home erweitert wird.
Antwort2
wie wäre es mit diesem awk-Befehl? Versuchen Sie es mit einem kleinen Satz von dat-Dateien
awk '{file=FNR".txt"; print $0 > file}' *.dat