簡體   English   中英

如何在 Linux 中的文件的特定行號中將數字乘以 2(雙)?

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

請注意,我指定FSOFS來通知 GNU AWK該字段被分隔並且應該由:而不是一個或多個空格字符(默認)分隔,並且不要使用sub function (用於使用正則表達式),但是而是簡單地增加 2 倍運算符( *=2 ),我也print行,因為沒有它 output 將是空的。 如果您想了解更多關於FSOFS的信息,請閱讀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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM