Как читать файл с помощью разделителя и записывать в другой файл построчно на основе разделителя с помощью сценария оболочки

У меня есть требование, скажем, файл foo.txt, который содержит пару ключ-значение, как показано ниже: vi foo.txt

a^1.0^b^2^cc^30^d^4^e^55^fg^67.0^h^8^i^99

и так далее. Мне нужно написать сценарий оболочки, чтобы поместить каждую пару ключ-значение в другую строку в другой файл, скажем, goo.txt, который содержит:

a^1.0^
b^2^
cc^30^
D^4^
e^55^
fg^67.0^
h^8^
i^99^

У меня есть аналогичный сценарий Perl для него, но мне нужен сценарий оболочки. Скрипт Perl похож на

#! /usr/bin/perl -w
#
use strict;
use Getopt::Long;
my $filename     = "";
my $Tags         = "";
GetOptions ('file=s' => \$filename);
if (defined $filename and $filename ne "")
{
    open (my $DATA,$filename) or die $!;
    $Tags       = <$DATA>;
    while ($Tags =~ m/(.*?\^.*?\^)/g)
    {
      print "$1\n";
    }
    close($DATA)
}

Мне нужен аналогичный код с использованием сценария оболочки. Нужна помощь в написании сценария оболочки (ksh) для моих требований.

2
0
69
2

Ответы 2

cat filename | awk -F"^" '{split($0, a, "^"); for(i=1;i<NF;i=i+2){print a[i]"^"a[i+1]"^"}} '

Ответы только на код улучшены с некоторыми пояснениями. Кроме того, время, необходимое для форматирования вашего кода, поможет

Ashley Mills 12.08.2018 21:40

Большое спасибо. Это именно то, что я ищу. Это решило мою проблему

Anand Kumar Singh 13.08.2018 11:13

Вам нужен дополнительный перевод строки после каждой секунды ^.
Поля без ^, символ, не ^, можно записать как [^^].
Каждые два поля (любое количество букв, кроме ^, за которыми следует ^ и снова), следует заменить на совпадение, за которым следует новая строка.

sed 's/[^^]*^[^^]*^/&\n/g' foo.txt

Другие вопросы по теме