簡體   English   中英

Bash:如何在一行上匹配特定數字時為一行添加前綴

[英]Bash: How to add a prefix to a line when a specific number is matched on a line

我有一個簡單的問題,我似乎找不到合適的解決方案。 我有很多這樣的行:

2020-10-07;2020-07-17;954;7004;something;something
2020-10-14;2020-07-16;955;10038;something;something

我想添加一個前綴1; 到第三個字段匹配的所有行954 ,所以它最終是這樣的:

1;2020-10-07;2020-07-17;954;7004;something;something
2020-10-14;2020-07-16;955;10038;something;something

我現在有一個非常糟糕的方法:

cat test.csv | awk -F ';' '{print $1,$2,$3,$4,$5,$6}' | awk '{if($3 == 954) print "1;"$0;}'

但是,當然,以空格作為分隔符的輸出。

如果有人有更聰明的方法,我將不勝感激。 謝謝!

Awk 可以輕松完成您的工作

awk 'BEGIN{FS=OFS=";"}$3 == 954{print 1,$0;next}1' file

#OR

awk 'BEGIN{FS=OFS=";"}$3 == 954{$0=1 OFS $0}1' file

#OR

awk 'BEGIN{FS=OFS=";"}{print ($3==954 ? 1 OFS:"") $0}' file

使用您的輸入文件:

$ cat file
2020-10-07;2020-07-17;954;7004;something;something 
2020-10-14;2020-07-16;955;10038;something;something

$ awk 'BEGIN{FS=OFS=";"}$3 == 954{print 1,$0;next}1' file
1;2020-10-07;2020-07-17;954;7004;something;something 
2020-10-14;2020-07-16;955;10038;something;something

$ awk 'BEGIN{FS=OFS=";"}$3 == 954{$0=1 OFS $0}1' file
1;2020-10-07;2020-07-17;954;7004;something;something 
2020-10-14;2020-07-16;955;10038;something;something

$ awk 'BEGIN{FS=OFS=";"}{print ($3==954 ? 1 OFS:"") $0}' file
1;2020-10-07;2020-07-17;954;7004;something;something 
2020-10-14;2020-07-16;955;10038;something;something

解釋

awk 'BEGIN{
         FS=OFS=";"       # set input and output field separator
     }
     $3 == 954{           # if 3rd field equal to 954 then
         print 1,$0;      # print 1 and then existing record/row
         next             # go to next line
     }1                   
     ' 
  • $3 == 954{$0=1 OFS $0}1 :如果第三個字段等於 954,則修改現有記錄/行( $0 ),值為1 ,output 字段分隔符OFS ,然后是現有行/記錄( $0 )。

  • 所以在結尾}1 :腳本末尾的 1 是一個沒有任何操作的條件(始終為真),因此它對每一行執行默認操作,打印該行(可能已被前面的操作修改)大括號)

這個單線也可能有幫助:

awk -F';' '{p=$3==954?"1;":""}{print p$0}' file 

你丟失的原因; 詮釋 output:

如果您編寫print $1,$2... awk 將使用默認的OFS ,即空格。 要解決這個問題,你基本上有兩種方法來 go:

  1. 設置OFS很簡單,正如另一個答案所示
  2. 不要設置任何字段,例如不要做類似$2=...的事情,而是使用sub()gsub()來更改文本。 打印時,不要包含逗號, ,只需打印$0連接其他字符串。 (我的單行顯示是這樣的)

使用sed ,加工第 3 列應該沒問題,但如果超過 5 列,那么awk就是這樣。

sed '/\([^;]*\)\([^;]*\);954[^;]*\(.*\)/s/^/1;/' file.txt 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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