我想按列名剪切CSV文件。
示例文件:
"column A","column B","column C","column D","column E",
aaa,bbb,ccc,ddd,eee,
111,222,333,444,555
column_A:
$ cat column_A
aaa
111
column_B:
$ cat column_B
bbb
222
当我使用awk
时,但它没有成功。有些时候我们在\n
见到""
。
像这样:
aaa,ssss,"zzz
xxx"
但这应该是一条线,我该怎么办? 只是1"它可以成功 但是当csv文件也可能\ n也可能“在线” 它' S 不会成功
function isallline(){
LineNumber=$1
LineInfo=`echo "$2"|tr -d '\n'`
FileName=$3
LastLineNumber=$4
GetInfo=`echo "$LineInfo"|awk -F '"' '{print NF-1}'`
IsAl=$((GetInfo%2))
if [[ $IsAl != 0 ]]
then
LineNumber=$((LineNumber+1))
LineInfo="$LineInfo""`sed -n ''$LineNumber'p' $FileName|tr -d '\n'`"
if [[ $LineNumber -le $LastLineNumber ]]
then
isallline $LineNumber "$LineInfo" $FileName $LastLineNumber
else
echo "error with not complte'\"'"
fi
else
echo "$LineInfo" >>CSVFile
return $LineNumber
fi
}
function GetCsvFile()
{
FileName=$1
>CSVFile #-- clearn file --
i=1 #-- declare i=1 --
LasetLineNumber=`wc -l $FileName|awk '{print $1 }'`
LineNumber=0 #-- declare LineNumber=0 --
while read LINE #-- read file --
do
getinfo=`echo $LINE|awk -F '"' '{print NF-1}'` #-- get count(") --
if [[ $getinfo != 0 ]]
then
if [[ $LineNumber == 0 ]]
then
isallline $i "$LINE" $FileName LasetLineNumber #-- call function isallline --
LineNumber=$? #-- get function isallline return(LineNumber) --
elif [[ $LineNumber -lt $i ]]
then
isallline $i "$LINE" $FileName LasetLineNumber
LineNumber=$?
fi
fi
if [[ $i -gt $LineNumber ]]
then
echo $LINE >> CSVFile
fi
let i++
done < $FileName
}
答案 0 :(得分:1)
从理论上讲,可以编写这样的正则表达式,它可以解析CSV。但是here很棒,为什么它或多或少几乎不可能。您最好使用特定的解析器。实际上,几乎所有的linux系统都安装了python而python includes tooling来解析CSV文件