AWK/SED/getline-如何简化/改进此示例?
我试图获取一个3列的输入文件,并根据第3列中的条件将其分离。我认为向你展示比解释更容易: 输入文件: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
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进行解决,请参阅其更好的解决方案发布问题,谢谢您的评论。我会记住的!非常感谢。非常感谢!:)