首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按正确的顺序插入数据,尽管当前并非所有值都存在

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

Stack Overflow用户
提问于 2014-04-24 03:20:51
回答 2查看 93关注 0票数 0

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

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

代码语言:javascript
复制
## 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文件中的文本:

代码语言:javascript
复制
## This user below belongs to Training 17:
12 TNG17

我猜我会使用sed或awk来查找地点,并使用

我的问题是,我需要找到包含TNG条目的部分,找到我的新条目所属的位置,然后插入新数据。我不能对整个数据进行排序,因为我需要实际数据之上的注释才能与数据保持一致!在本例中,我想在添加TNG17的TNG13 entry...since之后插入我的数据。( TNGXX前面的数字是随机的,对于识别需要的行没有实际的用处)

感谢您所能提供的任何帮助!

KSL。

更新:

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

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

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

发布于 2014-04-24 04:38:24

您可以尝试以下perl脚本:

代码语言:javascript
复制
#! /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);

作为./p.pl file tmp.txt从命令行运行它,其中file是您的文本文件,tmp.txt是临时文件。

票数 0
EN

Stack Overflow用户

发布于 2014-05-07 03:54:16

我以为这里已经关门了。就我而言,下面的解决方案效果最好。

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

代码语言:javascript
复制
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

谢谢。KSL>

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23253359

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档