如何使用awk保留输入字段中的空格

时间:2013-11-07 17:56:04

标签: awk cut spaces

我正在尝试做一些非常简单的事情,但它似乎比预期更复杂...... 我在一个文本文件中的行,用逗号分隔,我想输出到另一个文件,没有第一个字段。

输入:

echo file1,item,      12345678 | awk -F',' '{OFS = ";";$1=""; print $0}'

输出:

;item; 12345678

正如您所看到的,12345678之前的空格只是合并到一个空格中。 我也尝试过cut命令:

echo file1,item,      12345678 | cut -d, -f2-

我得到了同样的结果。

有解决方法吗?

实际上我的整个脚本如下:

cat myfile | while read l_line
   do
      l_line="'$l_line'"
      v_OutputFile=$(echo $l_line | awk -F',' '{print $1}')
      echo $(echo $l_line | cut -d, -f2-) >> ${v_OutputFile}
   done

但是l_line中的所有空格仍然存在但是一个空格被移除。我还在文件中创建了引号但结果相同。

2 个答案:

答案 0 :(得分:1)

问题在于您调用了echo命令,用于向上方提供awk测试数据。 shell正在查看此命令:

echo file1,item,      12345678

file1,item,12345678视为echo的两个独立参数。 echo只打印所有参数,用一个空格分隔。

如果你引用空格,如下:

echo 'file1,item,      12345678'

shell会将此解释为提供给echo的单个参数,因此您可以获得预期的结果。


在编辑OP后更新 - 看过完整的脚本后,您可以完全在awk中执行此操作:

awk -F, '{ OFS = "," ; f = $1 ; sub("^[^,]*,","") ; print $0 >> f }' myfile

答案 1 :(得分:1)

它与awk无关。引用echo中的字符串:

#with quotes
kent$  echo 'a,b,          c'|awk -F, -v OFS=";" '{$1="";print $0}'
;b;          c

#without quotes
kent$  echo a,b,          c|awk -F, -v OFS=";" '{$1="";print $0}' 
;b; c