[英]Using linux to find and replace the a value in a column in a tab delimited file
[英]Delete a column from a delimited file in linux
我有一個以下格式的文件:
col1|col2|col3|col4
a|b|c|d
e|f||h
i|j|k|l
我想從標題和數據中刪除col3(帶分隔符“|”)。 這可以使用awk / sed完成嗎?
請注意col3中的數據可能為空(第2行)。
輸出應該是:
col1|col2|col4
a|b|d
e|f|h
i|j|l
你可以簡單地使用cut
。
cut -d'|' -f1-2,4- file
這可能適合你(GNU sed):
sed 's/[^|]*|//3' file
awk 'BEGIN{FS=OFS="|"}{print $1,$2,$4}' file
應該給你輸出。
這是非常基本的awk用法。
編輯
你沒有提到70列...... :(
試試這個:
awk -F'|' '{s="";for(i=1;i<=NF;i++){f=(NF==i)?"":FS;if(i!=3)s=s $i f;}print s}' file
這是一個可能的sed解決方案:
sed -i.bak filename -e 's;\(^.*|.*|\).*|\(.*\);\1\2;'
這對於您的示例非常有用,並且可以針對其他示例進行調整,但實際上並不是通用解決方案。
說明:
-i.bak
編輯文件,首先進行名為filename.bak
的備份。
\\(^.*|.*|\\)
從行的開頭,匹配所有內容,包括第二個分隔符。 括號組匹配(組1)。
.*|
匹配所有內容,包括最后一個分隔符。
\\(.*\\)
匹配其余組和組(組2)。
\\1\\2
將所有以前的匹配替換為組1和組2中的文本。
使用cut
是正確的答案,但是如果你真的想使用awk
它比Kent顯示更容易:
awk -F'|' 'BEGIN {OFS="|"} {for (n=3; n < NF; ++n) $n = $(n+1); --NF; print}'
只需在$3
之后將字段拖放,然后通過更改NF
的值來更改字段數。
cut命令將有助於實現這一目標
cat filname | cut -d'|' -f1,2,4
如果您有許多列,則另一個awk
解決方案可能很有用
awk -F'|' '{$3="";$0=$0;$3=$3}1' FPAT='[^|]+' OFS='|' file
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.