如何对齐具有多行的第n列

我有3个变量,使用printf对齐它们的输出 我知道第一个环境变量是一行,所以第二个环境变量也是 第3个var的问题是此变量具有巨大的输出,因此我想将它们列出为对齐的(我希望下面可以清除我的问题)

**我没有列命令**

我正在使用

printf "%-20s %-5s %-20s \n" "${OUT}" "${COUNT}" "${DATA}"


OUT11                OUT2  OUT3
----------           ----- --------------
GATE1                14    CU4 CU2 CU9var CU3 CU1 CU11admin CU10opt not_sy 
CU_doonce cutttCU clocal_CU global_CU tivoli_CU 
GATE2                70    gdba_CU cdba_CU vudb_CU tti1_CU tti3_CU tt3_CU
3c2_CU tt3c3_CU tt3c4_CU tt3d1_CU tt3a1_CU tt3u1
3t3_CU tt3t4_CU tt4_CU utt4_CU tt4c1_CU tt4c2_CU
4d1_CU tt4a1_CU tt4u1_CU tt4t1_CU tt4t2_CU tt4t3
tt5_CU tt5c1_CU tt5c2_CU tt5c3_CU tt5c4_CU tt5d1
5t1_CU tt5t2_CU tt5t3_CU tt5t4_CU tt6_CU utt6_CU
6c3_CU tt6c4_CU tt6d1_CU tt6a1_CU tt6u1_CU tt6t1
6t4_CU tt7_CU utt7_CU tt7c1_CU tt7c2_CU tt7c3_CU
7a1_CU tt7u1_CU tt7t1_CU tt7t2_CU tt7t3_CU tt7t4

我需要它们为:

OUT11                OUT2  OUT3
----------           ----- --------------
GATE1                14    CU4 CU2 CU9var CU3 CU1 CU11admin CU10opt not_sy 
                           CU_doonce cutttCU clocal_CU global_CU tivoli_CU 
GATE2                70    gdba_CU cdba_CU vudb_CU tti1_CU tti3_CU tt3_CU
                           3c2_CU tt3c3_CU tt3c4_CU tt3d1_CU tt3a1_CU tt3u1
                           3t3_CU tt3t4_CU tt4_CU utt4_CU tt4c1_CU tt4c2_CU
                           4d1_CU tt4a1_CU tt4u1_CU tt4t1_CU tt4t2_CU tt4t3
                           tt5_CU tt5c1_CU tt5c2_CU tt5c3_CU tt5c4_CU tt5d1
                           5t1_CU tt5t2_CU tt5t3_CU tt5t4_CU tt6_CU utt6_CU
                           6c3_CU tt6c4_CU tt6d1_CU tt6a1_CU tt6u1_CU tt6t1
                           6t4_CU tt7_CU utt7_CU tt7c1_CU tt7c2_CU tt7c3_CU
                           7a1_CU tt7u1_CU tt7t1_CU tt7t2_CU tt7t3_CU tt7t4

Hearbirds 回答:如何对齐具有多行的第n列

请您尝试以下。

your_command | awk '
/GATE/{
  val=index($0,$3)
  while(++i<val){
    space=space OFS
  }
}
!/^GATE/{
  $0=space $0
}
1'

一个班轮:

your_command | awk '/GATE/{val=index($0,$3);while(++i<val){space=space OFS}} !/^GATE/{$0=space $0} 1'

或按照Ed先生的评论尝试以下操作:

your_command | awk '
/GATE/{
  space=sprintf("%*s",index($0,$3),"")
}
!/^GATE/{
  $0=space $0
}
1'
,
@author: Ernest
"""

# Example 2: Using ADF Test for Mean Reversion
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import statsmodels.api as sm
import pandas_datareader as pdr 
from statsmodels.tsa.stattools import adfuller
from datetime import datetime



def genhurst(z):
# =============================================================================
# calculation of Hurst exponent given log price series z
# =============================================================================
    z=pd.DataFrame(z)

    taus=np.arange(np.round(len(z)/10)).astype(int) # We cannot use tau that is of same magnitude of time series length 
    logVar=np.empty(len(taus)) # log variance

    for tau in taus:
        logVar[tau]=np.log(z.diff(tau).var(ddof=0))

    X=np.log(taus)    
    Y=logVar[:len(taus)]
    X=X[np.isfinite(logVar)]
    Y=Y[np.isfinite(logVar)]
#    pd.DataFrame(np.asmatrix([X,Y]).T).to_csv('XY.csv')

    X = sm.add_constant(X)
#    plt.scatter(X[:,1],Y) # for debug only
    model=sm.OLS(Y,X)
    results=model.fit()
    H=results.params[1]/2
    pVal=results.pvalues[1]
    return H,pVal


df = pdr.DataReader('BCH-USD','yahoo',datetime(2017,1,1),datetime(2019,10,25))

# df=pd.read_csv('inputData_USDCAD.csv')

y = df['Adj Close']

# y=df.loc[df['Time']==1659,'Close']


results=adfuller(y,maxlag=1,regression='c',autolag=None)
print(results)

# Find Hurst exponent
H,pVal=genhurst(np.log(y))
print("H=%f pValue=%f" % (H,pVal))

,

您使用以下行来打印行:

$ printf "%-20s %-5s %-20s \n" "${OUT}" "${COUNT}" "${DATA}"

您遇到的问题是${DATA}包含换行符。我们可以推断出这是因为您尝试在一个20个字符宽的字段中打印一个长度超过20个字符的字符串(您的格式显示了此信息)。这些换行符可确保您的DATA在下一行的开头继续。如果要对齐它们,则必须对该变量中的换行符进行少量替换。

示例:

$ p=$'foo\nbar'
$ printf "%-2s %1s\n" "a" "$p"
a  foo
bar
$ printf "%-2s %1s\n" "a" "${p//$'\n'/$'\n'   }"
a  foo
   bar

您知道DATA列必须从字符28开始。因此,它前面有27个字符(20 + 1 + 5 + 1)。因此,您所需要做的就是:

$ printf "%-20s %-5s %-20s \n" "${OUT}" "${COUNT}" "${DATA//$'\n'/$'\n'$(printf "%27s" "")}"

这应该在bash或现代ksh中起作用。如果您没有此选项,并且变量替换确实可以识别${var//str/repl},则可以使用awk快速对该行进行后处理:

$ printf "%-20s %-5s %-20s \n" "${OUT}" "${COUNT}" "${DATA}" \
  | gawk -v RS= '{gsub(ORS,ORS sprintf("%27s",""))}1'
本文链接:https://www.f2er.com/3138722.html

大家都在问