1

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

输入:

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 中除一个之外的所有空格都被删除。我还在文件中创建了引号,但结果相同。

4

2 回答 2

1

问题在于您调用用于提供上述测试数据的echo命令awk。shell 正在查看这个命令:

echo file1,item,      12345678

并将file1,item,and12345678视为 的两个单独参数echoecho只打印它的所有参数,用一个空格分隔。

如果要引用空格,如下所示:

echo 'file1,item,      12345678'

shell 会将其解释为要输入的单个参数echo,因此您将获得预期的结果。


编辑到 OP 后更新 - 看到你的完整脚本后,你可以完全做到这一点awk

awk -F, '{ OFS = "," ; f = $1 ; sub("^[^,]*,","") ; print $0 >> f }' myfile
于 2013-11-07T18:00:53.203 回答
1

它与awk无关。在你的回声中引用字符串:

#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
于 2013-11-07T18:01:47.737 回答