[英]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:
OFS
很簡單,正如另一個答案所示$2=...
的事情,而是使用sub()
、 gsub()
來更改文本。 打印時,不要包含逗號,
,只需打印$0
連接其他字符串。 (我的單行顯示是這樣的)使用sed
,加工第 3 列應該沒問題,但如果超過 5 列,那么awk
就是這樣。
sed '/\([^;]*\)\([^;]*\);954[^;]*\(.*\)/s/^/1;/' file.txt
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.