Awk 按正确的顺序插入数据,尽管当前并非所有值都存在

Awk 按正确的顺序插入数据,尽管当前并非所有值都存在,awk,sed,ksh,Awk,Sed,Ksh,我有一个文本文件,我想通过ksh脚本更新(仅“插入”)。 我想按正确的顺序插入案文;但是,当前不存在所有值 我的文本文件将包含以下数据: ## This file is used for ... ## ## The user below belongs to Training 13: 99 TNG13 ## The user below belongs to Training 21: 14 TNG21 我的计划是让ksh脚本创建要插入tmp文件的文本: ## This user belo

我有一个文本文件,我想通过ksh脚本更新(仅“插入”)。 我想按正确的顺序插入案文;但是,当前不存在所有值

我的文本文件将包含以下数据:

## This file is used for ...
## 

## The user below belongs to Training 13:
99 TNG13

## The user below belongs to Training 21:
14 TNG21
我的计划是让ksh脚本创建要插入tmp文件的文本:

## This user below belongs to Training 17:
12 TNG17
我猜我会使用sed或awk来找到这个位置并使用它 我的问题是,我需要找到包含TNG条目的部分,找到我的新条目所属的位置,然后插入新数据。我无法对整个数据进行排序,因为我需要实际数据上方的注释才能与数据保持一致!在本例中,我希望在TNG13条目之后插入数据…因为我正在添加TNG17。(TNGXX前面的数字是随机的,无法真正用于标识所需的行)

感谢您可能提供的任何帮助

KSL

更新:

我想出了一个解决办法,也许不是最干净的!。我可以看到此解决方案存在问题的两种情况: 1.如果我试图更新的条目是“TNG1”,因为它将没有引用! 2.如果我试图更新的条目在注释行中有TNGxx

我的ksh解决方案(到目前为止):


您可以尝试以下perl脚本:

#! /usr/bin/perl

use v5.14;
use autodie;


$/="";open(my $fh,"<",shift);my @a=<$fh>;close($fh);
$/=undef;open($fh,"<",shift); my $temp=<$fh>;close($fh);
my $pat=qr/^\d+\s+TNG(\d+)/m;
my ($key)=$temp=~$pat;

my @ind=grep($a[$_]=~ $pat,0..$#a);
my $ii; my $found=0;
for (@ind) {
    my ($keyi)=$a[$_]=~$pat;
    $ii=$_;
    if ($keyi>$key) {
        $found=1; $temp.="\n";
        last;
    }
}
if (!$found) {
    $ii=$ii+1; $temp="\n".$temp;
}
splice(@a,$ii,0,$temp);

print join("",@a);
#/usr/bin/perl
使用v5.14;
使用自动模具;

$/="";打开(我的$fh,“我以为这已经关闭了。出于我的目的,下面的解决方案效果最好

我的ksh解决方案(到目前为止):


谢谢。KSL>

如果您希望将有多个成员(例如)
Training 17
,最好将其包含在样本数据中,因为这会影响可能的建议。您还可以指出此项目的驱动需求:这是您希望自己学习的东西,还是您将自己使用的东西,或者在另一方面,这是一个针对拥有10万以上员工的企业培训部门的解决方案是吗?在任何非学习的情况下,你为什么不在数据库中这样做,或者至少让数据布局更易于进行所需的更新?祝你好运。所有问题都很好。首先,数字是在我的软件之外按用户分配的。我运行的软件需要一个平面文件中的条目;如果条目存在。不幸的是,我无法更改nge软件。我有一个脚本,首先查看此文件,如果条目不存在,则脚本当前会发出警告并存在。因为我可以在运行脚本期间获取信息,所以我希望在运行脚本时提供填充平面文件的功能。抱歉,但仍然难以理解您的意图。您说“我需要找到包含TNG条目的部分”。您的意思是文件中有多个不同类型数据的部分?还是SNG条目(或类似条目)您还需要处理吗?在上面的您中,TNG17是新数据吗?它需要介于TNG13和TNG21之间?样本输入所需的输出将使这更容易评估。注销一段时间。祝您好运!我在ksh方面取得了一些进展,但每当我尝试发布更新时,只要我按enter键,注释块就会关闭。我如何像上面的@Håkon Hægland那样在评论栏中输入我的文本?帮助文件说在行尾空白处…对我不起作用。对于我的解决方案,我基本上已经找到了一种方法,但我的sed语句没有在评论后添加cr。我会在找到如何放置注释后尽快发布我的内容我的评论栏中的换行!@leonhardtk你说的
评论栏关闭是什么意思?
?我已经点击“添加评论”发布我的结果,但当我点击“回车”输入新行时,它就会提交我的评论。但我只是想要一个新行开始发布我的结果…?也许我应该做“回答你的问题”而不是添加注释“?@leonhardtk请在按enter键的同时按住shift键。请注意,我上面的回答是回答,而不是注释:)如果您以其他方式解决了问题,您可以更新您的问题,或者使用
回答您自己的问题
发布解决方案。通常在另一个解决方案或答案下方发布解决方案作为注释不是一个好主意。。明白了。这方面仍然是新的…谢谢您的提示。我采纳了您的建议并添加了我的进度对于最初的问题…不是一个完美的解决方案,也不一定是一个干净的解决方案…但会让我通过…除非有人想出更好的主意?!谢谢。KSL。
#! /usr/bin/perl

use v5.14;
use autodie;


$/="";open(my $fh,"<",shift);my @a=<$fh>;close($fh);
$/=undef;open($fh,"<",shift); my $temp=<$fh>;close($fh);
my $pat=qr/^\d+\s+TNG(\d+)/m;
my ($key)=$temp=~$pat;

my @ind=grep($a[$_]=~ $pat,0..$#a);
my $ii; my $found=0;
for (@ind) {
    my ($keyi)=$a[$_]=~$pat;
    $ii=$_;
    if ($keyi>$key) {
        $found=1; $temp.="\n";
        last;
    }
}
if (!$found) {
    $ii=$ii+1; $temp="\n".$temp;
}
splice(@a,$ii,0,$temp);

print join("",@a);
myid = `echo $USERNAME|cut -c4-6`
tng_id = $myid
while [[ $tng_id > 0 ]]
  do
grep tng$tng_id $file1 > /dev/null
  if [ #? = '0' ]; then   
    PATTERN = "tng$tng_id"
    echo "Creating entry after $PATTERN"
    sed -I "/$PATTERN/a \\ \n# Creating entry for tng$myid" $file1"\n
    break
  fi
  (( $tng_id-- ))
done