Как открыть файл и создать новый файл из содержимого первого файла - PullRequest
0 голосов
/ 26 мая 2020

У меня есть входной файл original.txt с содержимым как

AS1023000404 SA26376 EFadadhkaj ASssjdiw9128129010210 EF939809

здесь я хотел создать новые файлы на основе First 2 letters of each line, т.е. из данного исходного файла, который у меня должен быть ниже.

file 1 = AS.txt content: AS1023000404 ASssjdiw9128129010210

File 2 = SA.txt Content: SA26376

File 3 = EF.txt Content: EFadadhkaj EF939809

Кто-нибудь может мне помочь, как я могу этого достичь.

добавление perl кода, который я пробовал.

while (<$INFILE>) { if (length($_) > 0) { $outFlName = substr($_,$start,$len);

` if (not $OUTFILE{$outFlName}) {
     open $OUTFILE{$outFlName}, '>', "${outFlName}.txt"
       or die "Unable to open '${outFlName}.txt' for output: $!";
     $OUTREC{$outFlName} = 0;
 }
 print { $OUTFILE{$outFlName} } $_;
 $OUTREC{$outFlName} = $OUTREC{$outFlName} + 1;`

} } close $_ for values %OUTFILE;

Ответы [ 2 ]

4 голосов
/ 26 мая 2020

Не могли бы вы попробовать следующее.

awk '
{
  output_file=substr($0,1,2)".txt"
}
{
  print >> (output_file)
  close(output_file)
}
' Input_file

Пояснение: Добавление подробного объяснения к вышеизложенному.

awk '                                   ##Starting awk program from here.
{
  output_file=substr($0,1,2)".txt"      ##Creating output_file which has first 2 letters of current line.
}
{
  print >> (output_file)                ##Printing line to output file.
  close(output_file)                    ##Closing output file in back ground.
}
' file
3 голосов
/ 26 мая 2020

С GNU awk для обработки множества одновременно открытых файлов:

awk '{print > (substr($0,1,2) ".txt")}' file

С любой сортировкой awk + для эффективности только закрывать / открывать каждый выходной файл, поскольку имя выходного файла изменяется для всех строк с те же первые 2 символа вместо того, чтобы делать это для каждой строки:

awk '{print NR, substr($0,1,2), "," $0}' file |
sort -k2,2 -k1,1n |
awk '$2 != prev{close(out); out=$2 ".txt"; prev=$2} {sub(/[^,]+,/,""); print > out}'
...