2016-07-25 59 views
1

我有兩個大的文件(〜10GB)如下:從列減去恆定數量

file1.csv

name,id,dob,year,age,score 
Mike,1,2014-01-01,2016,2,20 
Ellen,2, 2012-01-01,2016,4,35 
. 
. 

file2.csv

id,course_name,course_id 
1,math,101 
1,physics,102 
1,chemistry,103 
2,math,101 
2,physics,102 
2,chemistry,103 
. 
. 

我想從這些文件的「id」列中減去1:

file1_updated.csv

name,id,dob,year,age,score 
Mike,0,2014-01-01,2016,2,20 
Ellen,0, 2012-01-01,2016,4,35 

file2_updated.csv

id,course_name,course_id 
0,math,101 
0,physics,102 
0,chemistry,103 
1,math,101 
1,physics,102 
1,chemistry,103 

我已經試過awk '{print ($1 - 1) "," $0}' file2.csv,但並沒有得到正確的結果:

-1,id,course_name,course_id 
0,1,math,101 
0,1,physics,102 
0,1,chemistry,103 
1,2,math,101 
1,2,physics,102 
1,2,chemistry,103 

回答

3

你已加入在你的嘗試中增加一列。相反,你的第一場$1設置爲$1-1

awk -F"," 'BEGIN{OFS=","} {$1=$1-1;print $0}' file2.csv 

這分號分隔的命令。我們將分隔符設置爲逗號(-F",")並將輸出字段分隔符設置爲逗號BEGIN{OFS=","}。從第一個字段中減去1的第一個命令首先執行,然後執行第二個打印命令,因此整個記錄$0現在將在打印時包含新的$1值。

只從不是您的標題的記錄中減去1可能會有幫助。所以,你可以添加一個條件,第一個命令:

awk -F"," 'BEGIN{OFS=","} NR>1{$1=$1-1} {print $0}' file2.csv 

現在我們只在記錄號(NR)大於1,那麼我們只打印整個記錄減去。

+0

謝謝,但'awk'{$ 1 = $ 1-1; print $ 0}'file2.csv'只輸出第一列減1.我需要輸出中的所有列。 – Malgi

+0

我的不好。我已更新腳本,將輸入字段分隔符更改爲逗號以及輸出字段分隔符 – JNevill

+0

謝謝@JNevill。你救了我的一天;) – Malgi