![](/img/trans.png)
[英]How to grep the line number of result of that particular file, from multiple files
[英]How to multiple a number by 2 (double)present in a particular line number of a file, in Linux?
文件_A
Name: John Smith
Grade: 8
Institute: Baldwin
Number of entries: 125
State: Texas
文件_B
Name: David Buck
Grade: 9
Institute: High Prime
Number of entries: 123
State: California
有許多類似的文件,其中條目數(在所有文件的第 4 行)必須加倍。
對於 File_A,它應該是 250,對於 File_B,它應該是 246。
如何對 Linux 中的所有文件執行此操作?(使用 sed 或 awk 或任何其他命令)
試過的命令:
sed -i '4s/$2/$2*2/g' *.txt (nothing happening from this)
awk "FNR==4 {sub($2,$2*2)}" *.txt (getting syntax error)
對於您展示的樣品,請嘗試遵循awk
代碼。 簡單的解釋是查找/搜索字符串/Number of entries:
然后將 2 乘以最后一個字段的值並將其保存在自身中,然后通過提及1
打印行。
awk '/Number of entries:/{$NF = ($NF * 2)} 1' File_A File_B
Run above command it will print output on screen, once you are Happy with output and want to save output into Input_file itself then you can try awk
's -inplace
option(available in GNU awk
4.1+ version etc).
此外,如果您的文件擴展名為.txt,則將其傳遞給awk
程序本身, awk
本身可以讀取多個文件。
這可能對您有用(GNU sed 和外殼):
sed -Ei '4s/(.* )(.*)/echo "\1$((\2*2))"/e' file1 file2 filen
對於每個文件輸入的第四行,將值拆分為兩個反向引用,並使用 shell 算法將這些值回顯,使第二個值加倍。
注意-i
選項允許在所有輸入文件中找到第 4 行的地址,並且可以就地修改這些文件。
使用sed
$ sed '/^Number of entries/s/[[:digit:]]\+/$((&*2))/;s/^/echo /e' input_file
我想解釋一下為什么你嘗試過的失敗,首先
sed -i '4s/$2/$2*2/g' *.txt
$
對於 GNU sed
沒有特殊含義,它是文字美元符號,GNU sed
也不支持算術,所以上面的命令是:在第 4 行替換美元符號后跟 2 使用美元符號后跟 2 后跟 asterix 后跟 2並在全球范圍內這樣做。 您在文件的第 4 行沒有文字$2
,它首先被夯實,所以什么也沒有發生。
awk "FNR==4 {sub($2,$2*2)}" *.txt
你不應該使用"
來包含 awk 命令,除非你想召喚令人難以置信的錯誤。你應該使用'
在這種情況下語法錯誤將會消失,但是行為將不會如你所願。為了做到這一點,你的代碼可能會被重新編寫至
awk 'BEGIN{FS=OFS=": "}FNR==4{$2*=2}{print}' *.txt
請注意,我指定FS
和OFS
來通知 GNU AWK
該字段被分隔並且應該由:
而不是一個或多個空格字符(默認)分隔,並且不要使用sub
function (用於使用正則表達式),但是而是簡單地增加 2 倍運算符( *=2
),我也print
行,因為沒有它 output 將是空的。 如果您想了解更多關於FS
或OFS
的信息,請閱讀8 強大的 Awk 內置變量 – FS、OFS、RS、ORS、NR、NF、FILENAME、FNR
謝謝你的所有答案。 在您的幫助下,我能夠通過理解和結合您的答案找出簡單的解決方案。
這是(在我的環境中工作):
在終端上顯示: awk 'FNR==4 {sub($4,$4*2)} 1' File_A
移動到某個文件: awk 'FNR==4 {sub($4,$4*2)} 1' File_A > temp_A
使用 inplace 執行文件內部更改: awk -i inplace 'FNR==4 {sub($4,$4*2)} 1' *.txt
$4
是該行的第四個參數; FNR==4
為第 4 行; 最后的1
有助於打印所有內容
mawk 'BEGIN{ _+=_^=FS=OFS="Number of entries: " } NF<_ || $NF *=_'
Name: John Smith
Grade: 8
Institute: Baldwin
Number of entries: 250
State: Texas
Name: David Buck
Grade: 9
Institute: High Prime
Number of entries: 246
State: California
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.