簡體   English   中英

從linux中的分隔文件中刪除一列

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

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