For-Schleife innerhalb einer anderen funktioniert nicht

For-Schleife innerhalb einer anderen funktioniert nicht
#! /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.txtdie L-Zeile von 1.dat, die L-Zeile von 2.datusw. steht. Dazu verwende ich den sedBefehl, 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

verwandte Informationen