[英]How to insert additional field after third field if number of field separators in line is 5 using sed or awk
例如,是否可以運行sed命令來檢查一行中的字段分隔符的數目,並在行中分隔符的數目為5時插入一個附加的分隔符?
源數據示例:
a,aaa|bbbb|cccc|dddd|eeee|ffff|gggg
aaaa|bb,bb|dddd|eeee|fff,f|gggg
aaa,a|bbbb|cccc|dddd|eeee|ffff|gggg
目標輸出示例:
a,aaa|bbbb|cccc|dddd|eeee|ffff|gggg
aaaa|bb,bb||dddd|eeee|fff,f|gggg
aaa,a|bbbb|cccc|dddd|eeee|ffff|gggg
注意:如果行中僅存在5個字段分隔符,目標是在該行的第二個字段分隔符之前或之后插入一個附加的字段分隔符(|),以創建空白的第3個字段。
如果使用sed無法做到這一點,awk是否能夠完成任務?
任何指導將不勝感激。
這樣的事情應該起作用:
awk -F '|' -v OFS='|' 'NF<7{$2=$2 FS} 1'
-F '|'
將輸入字段分隔符設置為|
。
-v OFS='|'
將輸出字段分隔符設置為|
。
當場數NF小於7時,場分隔符FS被附加到第二場。
這可能對您有用(GNU sed):
sed 's/|/&/6;t;s/|/&&/2' file
如果字段分隔符的數量足夠多(在這種情況下為6),請紓困。
否則,請在必填字段(在本例中為2)上將字段分隔符加倍。
如果只想添加五個分隔符,請使用:
sed 's/|/&/6;t;s/|/&/5;T;s/|/&&/2' file
sed最有可能實現:
sed '/^[^|]*\(|[^|]*\)\{5\}$/s/|/||/2'
5
是將觸發更換的分隔符的數量,行尾的2
是將進行替換的分隔符數量。
這已經是有點更具可讀性和很多比我原來的企圖更易於維護:
sed 's/^\([^|]*|[^|]*\)\(\(|[^|]*\)\{4\}\)$/\1|\2/'
不過,就可讀性而言,awk解決方案是最好的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.