簡體   English   中英

使用awk格式化閱讀

[英]formatted reading using awk

我試圖使用awk讀取格式化的文件。 內容如下所示:

    1PS1     A1    1  11.197   5.497   7.783
    1PS1     A1    1  11.189   5.846   7.700
    .
    .
    .

在c格式之后,這些行的格式為“%5d%5s%5s%5d%8.3f%.3f%8.3f”,其中前5個位置是整數(1),接下來5個位置是字符(PS1),下一個5個位置是字符(A1),接下來的5個位置是整數(1),接下來的24個位置被分成3列8個位置,3個小數點浮點數。

我一直在使用的是使用“$ 1,$ 2,$ 3”將這些行分隔為列。 例如,

cat test.gro | awk 'BEGIN{i=0} {MolID[i]=$1; id[i]=$2; num[i]=$3; x[i]=$4; 
y[i]=$5; z[i]=$6; i++} END { ...} >test1.gro

但是我遇到了一些問題,現在我試圖以上面討論的格式化方式讀取這些文件。

知道我是怎么做到的嗎?

查看您的示例輸入,似乎格式字符串實際上是"%5d%-5s%5s%5d%8.3f%.3f%8.3f" ,第一個字符串字段是左對齊的。 awk沒有scanf()函數太糟糕了,但你可以用幾個substr()調用來獲取你的數據

awk -v OFS=: '
  {
     a=substr($0,1,5)
     b=substr($0,6,5)
     c=substr($0,11,5)
     d=substr($0,16,5)
     e=substr($0,21,8)
     f=substr($0,29,8)
     g=substr($0,37,8)
     print a,b,c,d,e,f,g
   }
'

輸出

    1:PS1  :   A1:    1:  11.197:   5.497:   7.783
    1:PS1  :   A1:    1:  11.189:   5.846:   7.700

如果你有GNU awk,你可以像這樣使用FIELDWIDTHS變量:

gawk -v FIELDWIDTHS="5 5 5 5 8 8 8" -v OFS=: '{print $1, $2, $3, $4, $5, $6, $7}'

也是輸出

    1:PS1  :   A1:    1:  11.197:   5.497:   7.783
    1:PS1  :   A1:    1:  11.189:   5.846:   7.700

你從來沒有確切地說過你認為哪些字段應該具有哪個數字,所以我想清楚awk認為它是如何工作的(你明確選擇在輸出格式字符串字段中調用空格會讓我擔心一點。你。可能對此有不同的想法而不是awk 。)

從聯機幫助頁:

輸入行通常由用空格或正則表達式FS分隔的字段組成。 字段表示為$ 1,$ 2,...,而$ 0表示整行。 如果FS為null,則輸入行將被分成每個字符一個字段。

請注意,輸入行中的空格不會被分配一個字段編號,並且連續的空格被視為單個字段分隔符。

您可以使用以下內容進行測試:

echo "1   2 3 4" | awk '{print "1:" $1 "\t2:" $2 "\t3:" $3 "\t4:" $4}'

在命令行。


當然,所有這些都假設你沒有使用FS變量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM