[英]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.