2016-11-16 85 views
-2

我有一個包含線和分離,並依次數據爲.txt「」例如:修改行.txt文件在bash

10,05,nov,2016,122,2,2,330,user 

我要的是能夠修改不重複搜索方法是唯一的第一個數字的X行的參數。 例如找到數字10(f1)並修改包含122(f5)的行。 我用sed試過了,但我做不到。 我已經評論說可以用awk,但我沒有學習過這個命令。 有些幫助?

+0

請將您希望的輸出樣本輸入添加到您的問題中。 – Cyrus

+0

歡迎來到Stack Overflow!請[編輯]你的問題,以顯示[你迄今爲止所嘗試的](http://whathaveyoutried.com)。您應該包含您遇到問題的代碼[mcve],然後我們可以嘗試幫助解決特定問題。你還應該閱讀[問]。 –

回答

1

一個簡單的awk腳本類似下面應該做的伎倆:

awk -v find="10" -v field="5" -v newval="abcd" 'BEGIN {FS=OFS=","} {if ($1 == find) $field=newval; print $0}' test.csv 

說明:

  • awk -v find="10" -v field="5" -v newval="abcd":定義awk的3個變量。 find,其中包含我們正在尋找的模式,field包含我們要編輯的字段的編號,以及newval與要替換的值。
  • BEGIN {FS=OFS=","}:在遍歷文件之前,我們將文件分隔符和輸出文件分隔符設置爲「,」。
  • if ($1 == find) $field=newval:如果某行的1RST字段包含我們想要的模式,我們設定的第N場(1日如果$field=1,第二如果$field=2,...)來的newval
  • print $0價值:不論結果如何,從如果測試,我們打印整條線。

較短(但不太理解的)版本的腳本可以寫爲:

awk -v a="10" -v f="5" -v n="abcd" -F, '$1 == a {$f=n}OFS=FS' test.csv 

afindffieldnnewval-F,FS=","

腳本在行動:

> cat test.csv 
11,05,nov,2016,122,2,2,330,user 
10,05,nov,2016,123,2,2,330,user 
12,05,nov,2016,124,2,2,330,user 

> awk -v find="10" -v field="5" -v newval="abcd" 'BEGIN {FS=OFS=","} {if ($1 == find) $field=newval; print $0}' test.csv 
11,05,nov,2016,122,2,2,330,user 
10,05,nov,2016,abcd,2,2,330,user 
12,05,nov,2016,124,2,2,330,user 
0

使用sed:

$ sed '/^10/s/,[^,]*/,333/4' <<< "10,05,nov,2016,122,2,2,330,user" 
10,05,nov,2016,333,2,2,330,user 

在開始10線,尋找第四逗號緊跟非逗號字符,並與您的替換字符串替換。