Unix中的列处理



我的输入文件有

col1, col2, col3, col4, col5, col6, col7
111,0.1, 0.5,[a,b,c,d],

我想用逗号分隔col4中的值,并将前3个值放在col5、col6、col7中,忽略第4个值。

预期输出:

col1, col2, col3, col4, col5, col6, col7
111,0.1, 0.5,[a,b,c,d],a,b,c

请帮忙。

我使用了以下命令:

echo "col1tcol2tcol3tcol4tcol5tcol6tcol7" >> cipoc_output.csv
awk -F"," '$1=$1' OFS="t" cipoc_input.csv >> cipoc_output.csv
cat cipoc_output.csv

您可以将此gnu awkFPAT:一起使用

awk -v FPAT='\[[^]]*]|[^,]+' 'NR > 1 {
s=$4
gsub(/^[|,[^,]+]$/, "", s)
$0 = $0 s
} 1' file
col1, col2, col3, col4, col5, col6, col7
111,0.1, 0.5,[a,b,c,d],a,b,c
$ awk 'BEGIN{FS=OFS=","} NR==1{print; next} {o=$0; gsub(/[][]/,""); print o $4, $5, $6}' file
col1, col2, col3, col4, col5, col6, col7
111,0.1, 0.5,[a,b,c,d],a,b,c

如果这还不是你所需要的全部,那么编辑你的问题,以提供更具代表性的样本输入/输出,但这并不适用。

您能尝试以下内容吗https://ideone.com/o0slbt

awk '
FNR==1{ print; next }
match($0,/[[^]]*/){
val=substr($0,RSTART,RLENGTH)
start=RSTART
end=RSTART+RLENGTH
match(val,/.*,/)
print substr($0,1,start) substr(val,RSTART+1,RLENGTH) substr($0,end) substr(val,RSTART+1,RLENGTH-2)
val=start=end=""
next
}
1
' Input_file

这里是一个sed解决方案,假设周围没有任何极端字符。

> sed -e 's/[([^][]*),[^,]*],/&1/g' file
col1, col2, col3, col4, col5, col6, col7
111,0.1, 0.5,[a,b,c,d],a,b,c

最新更新