2017-05-24 45 views
1

我正在學習一些awk。我在網上找到了一個採取固定寬度文件並將其轉換爲csv文件的示例。這裏只是其中的一部分,我不明白,即使經過許多人的網頁和在線教程去後:請解釋此aw​​k腳本採取固定寬度爲CSV

1: awk -v FIELDWIDTHS='1 10 4 2 2' -v OFS=',' ' 
2: { $1=$1 ""; print } 
3: ' data.txt` 

即從樣品在線(found here)一字不差。

我不明白的是第2行。我沒有條件,所以'程序'(包含在括號中)將始終執行每條記錄(行)。我不明白爲什麼它在執行$1=$1以及空字符串語句"";。但是,刪除這些會導致錯誤的行爲。

+1

該行最好寫成'{$ 1 = $ 1} 1',並且只是強制更改記錄結構,以便'awk'使用'OFS'將每行重寫爲逗號 – anubhava

+1

Thanks @anubhava。當我運行'{$ 1 = $ 1;打印}'它的工作!關於改變記錄結構以引起重寫的你的評論是關鍵!如果你想寫一個答案,我會投票。 – ryancdotnet

+1

此外,有了這些信息,我能夠找到一個相關的SO問題和一些其他有用的信息:https://stackoverflow.com/questions/13704947/print-all-fields-with-awk-separated-by-ofs – ryancdotnet

回答

1

$1=$1將值賦予$ 1(恰好與它已有的值相同)。爲字段分配任何值都會導致awk使用字段之間的OFS值重新編譯當前記錄(有效地用OFS替換所有FS或FIELDSEPS間距)。

$ echo 'a,b,c' | awk -F, -v OFS="-" '{print; $1=$1; print}' 
a,b,c 
a-b-c 

""是因爲誰寫的劇本並不十分了解的awk,認爲這是必要的,以確保在分配之前將它們轉換爲字符串的數字保留其精度。

+1

謝謝埃德莫頓!關於以下來自互聯網博客帖子的建議也是一個很好的提醒...... :) – ryancdotnet