我有一個包含實驗時間的文本檔案
>
0.000
0.010
0.020
0.030
0.040
0.050
>
0.000
0.010
0.020
0.030
>
0.000
0.010
0.020
0.030
0.040
0.050
我想通過找出整個輸入資料的最大值來均衡每個塊,然后根據資料的增量(從輸入自動計算)單個塊應該等于輸入資料中存在的最大值,預期輸出是
>
0.000
0.010
0.020
0.030
0.040
0.050
>
0.000
0.010
0.020
0.030
0.040
0.050
>
0.000
0.010
0.020
0.030
0.040
0.050
我嘗試了下面給出的代碼,但它通過重復下面給出的第二個塊的最后一行來給出結果,這與預期的輸出不同
>
0.000
0.010
0.020
0.030
0.040
0.050
>
0.000
0.010
0.020
0.030
0.030
0.030
>
0.000
0.010
0.020
0.030
0.040
0.050
我的劇本
awk '$0==">" {
if (c && c>max)
max = c
n
c = 0
next
}
{
r[n][ c] = $0
}
END {
for (i=1; i<=n; i) {
print ">"
for (j=1; j<=(max>c?max:c); j){
print (r[i][j] == "" ? prev : r[i][j])
prev=r[i][j]==""?prev:r[i][j]
}
}
}' input
此代碼通過重復第二個塊的最后一行值來給出輸出,因為我犯了一些錯誤。我希望專家可以幫助克服這個問題。提前致謝。
uj5u.com熱心網友回復:
如果這不是您所需要的全部:
$ cat tst.awk
NR==FNR {
if ( !/>/ && ((max == "") || ($1 > max)) ) {
max = $1
}
if ( (prev == prev 0) && ($1 == $1 0) ) {
step = $1 - prev
}
prev = $1
next
}
/>/ {
if ( FNR > 1 ) {
prt()
}
}
{
print
prev = $1
}
END { prt() }
function prt( i) {
for ( i=prev step; i<=max; i =step ) {
printf "%.03f\n", i
}
}
$ awk -f tst.awk file file
>
0.000
0.010
0.020
0.030
0.040
0.050
>
0.000
0.010
0.020
0.030
0.040
0.050
>
0.000
0.010
0.020
0.030
0.040
0.050
然后編輯您的問題以闡明您的要求并提供更具代表性的示例輸入/輸出,包括上述不適用的情況。
uj5u.com熱心網友回復:
假設/理解:
- 所有塊都以相同的值開始(例如,
0.000) - 所有值都增加相同的數量(例如,
0.010) - 所有塊都將被擴展以包含所有值
- 凈目標是顯示相同的塊
N時間(N塊數在哪里)
一個awk需要輸入檔案單遍的想法:
awk '
/^>/ { blkcnt ; next }
!($1 in seen) { seen[$1]; arr[ n]=$1 }
END { for (i=1;i<=blkcnt;i ) {
print ">"
for (j=1;j<=n;j )
print arr[j]
}
}
' input
這會產生:
>
0.000
0.010
0.020
0.030
0.040
0.050
>
0.000
0.010
0.020
0.030
0.040
0.050
>
0.000
0.010
0.020
0.030
0.040
0.050
筆記:
- 我猜 OP 的現實生活中的輸入檔案還有更多內容(例如,每一行都包含計時值之后的額外文本資料),在這種情況下,這個解決方案是不夠的
- 如果是這種情況,那么 OP 應該使用一組更具代表性的樣本資料來更新問題
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/465262.html
上一篇:從列中的串列中洗掉方括號
