AWK/SED/getline-如何简化/改进此示例?

AWK/SED/getline-如何简化/改进此示例?,awk,sed,getline,Awk,Sed,Getline,我试图获取一个3列的输入文件,并根据第3列中的条件将其分离。我认为向你展示比解释更容易: 输入文件: outputfile1.txt 26 NCC 1 # First Start 38 NME 2 44 NSC 1 # Start2 56 NME 2 62 NCC 1 # Start3 ... 314 NCC

我试图获取一个3列的输入文件,并根据第3列中的条件将其分离。我认为向你展示比解释更容易:

输入文件:

outputfile1.txt
 26         NCC      1     # First Start
 38         NME      2
 44         NSC      1     # Start2
 56         NME      2
 62         NCC      1     # Start3
...
314         NCC      1     # Start17
326         NME      2
332         NSC      1     # Start18
344         NME      2
349         NME      2     # Final End
(散列注释不是文件的一部分,我添加这些注释是为了让事情更清楚)

第3列用于确定新的“开始”条目

“开始/结束”值来自第1列

“TITLE”我希望是连续“开始”之间第2列中的所有值

所需输出

outputfile2.txt
START=26 ; END=43 ; TITLE=NCC_NME
START=44 ; END=61 ; TITLE=NSC_NME
START=62 ; END=79 ; TITLE=NCC_...
...
START=314 ; END=331 ; TITLE=NCC_NME
START=332 ; END=349 ; TITLE=NSC_NME
outputfile2.txt
START=26 ; END=43
START=44 ; END=61
START=62 ; END=79
...
START=314 ; END=331
START=332 ; END=349
“几乎”这样做,但在此过程中生成5个单列临时文件的粗糙脚本

awk '{ print $1 }' outputfile1.txt | sed '$d' > tempfile1.txt
awk '{ print $1-1 }' outputfile1.txt | sed '$d' > tempfile2.txt
sed '$d' outputfile1.txt | awk 'NR{print $3-p}{p=$3}' > tempfile3.txt

awk '  { getline value < "tempfile1.txt" }
       { if (NR==1)
       print value ;
       else if( $1 != 1 )
       print value }' tempfile3.txt > tempfile4.txt

awk '  { getline value < "tempfile2.txt" }
       { if (NR==1)
       print value ;
       else if ( $1 != 1 )
       print value }' tempfile3.txt | sed '1d' > tempfile5.txt
awk 'END{print $1}' outputfile1.txt >> tempfile5.txt

awk '   { getline value < "tempfile5.txt" }
        {print "START="$0 " ; END="value}' tempfile4.txt > outputfile2.txt

电流输出

outputfile2.txt
START=26 ; END=43 ; TITLE=NCC_NME
START=44 ; END=61 ; TITLE=NSC_NME
START=62 ; END=79 ; TITLE=NCC_...
...
START=314 ; END=331 ; TITLE=NCC_NME
START=332 ; END=349 ; TITLE=NSC_NME
outputfile2.txt
START=26 ; END=43
START=44 ; END=61
START=62 ; END=79
...
START=314 ; END=331
START=332 ; END=349

您可以使用以下工具一次性完成所有工作:

awk '{ 
  if(NR==1){    

     # if we are the first record we initialize our variables
     PREVIOUS_ONE=$1
     TITLE=$2
     PREVIOUS_THIRD=$3

  } else {

    # as long as the new third column is larger we update our variables
    if(PREVIOUS_THIRD < $3) { 

       TITLE=TITLE"_"$2
       PREVIOUS_THIRD=$3

    } else {  
       # this means the third column was smaller
       # we print out the data and reinitialize our variables
       print "START="PREVIOUS_ONE" ; END="$1-1" ; TITLE= "TITLE;

       PREVIOUS_ONE=$1 
       TITLE=$2
       PREVIOUS_THIRD=$3
    }   
  }
  }' outputfile1.txt 
awk'{
如果(NR==1){
#如果我们是第一条记录,我们初始化变量
上一张=1美元
头衔=$2
前三名=3美元
}否则{
#只要新的第三列更大,我们就更新变量
如果(前三次<$3){
TITLE=TITLE“u”$2
前三名=3美元
}否则{
#这意味着第三列更小
#我们打印出数据并重新初始化变量
打印“START=”PREVIOUS_ONE“END=“$1-1”;TITLE=”TITLE;
上一张=1美元
头衔=$2
前三名=3美元
}   
}
}'outputfile1.txt
试试:


未来的一些提示:1)不要使用sed同时处理多个输入行,而是使用awk。2) 如果已经在使用awk,则永远不需要sed。3) 只有极少数特定类型的问题适合使用getline进行解决,请参阅其更好的解决方案发布问题,谢谢您的评论。我会记住的!非常感谢。非常感谢!:)