2017-08-30 77 views
0

在Unix系统来提取文件的含字段分隔符,假设一个文件包含5个字段&数据如:如何使用剪切命令

"112233"|"Roshan"|"25"|" FAX 022 3987789 \| TEL 77766288892 \| abc "|"Male" 

需要提取第四字段。使用以下

column_value=`echo $line | cut -f4 -d'|'` 

只有我们将只得到" FAX 022 3987789 \

但需要" FAX 022 3987789 \| TEL 77766288892 \| abc "为第4列的值。

+1

'cut'是不正确的工具。你需要一个CSV解析器 –

+0

更重要的是,将值读入一个变量'$ line'可能是错误的方法(如果你确实这样做了,可以使用'read -r'并引用'“$ line”'到处)。 – tripleee

回答

0

您可以按如下

echo $line | cut -f 4,5,6 -d\| 

另外,您可以用sed来代替添加两个额外的字段“|”定界符用不同的字符(例如,标签)

echo $line | sed s/\"\|\"/\t/g | cut -f 4 
1

cut是不适合工作的工具,当它涉及到需要用于分析输入串/文件的多字符分隔符。

您可以使用GNU Awk with FPAT定义记录中每个字段的外观应如何。你可以把FPAT写成正则表达式常量,在这种情况下,下面的东西应该可以工作。

FPAT = "(\"[^\"]+\")" 

Awk命令利用这一点,

line='"112233"|"Roshan"|"25"|" FAX 022 3987789 \| TEL 77766288892 \| abc "|"Male"' 
awk ' 
BEGIN { 
    FPAT = "(\"[^\"]+\")" 
}{print $4}' <<<"$line" 

产生一个输出作为

" FAX 022 3987789 \| TEL 77766288892 \| abc " 

Regular Expression - Test results

+2

参见https://stackoverflow.com/questions/7804673/escaping-separator-within-double-quotes-in-awk – tripleee