0

我想将输入的每一行括在方括号中。我可以添加开头的方括号。但不是结局。结尾的“]”转到下一行并剪切该行。

例如 - 这是我的脚本 -

cat file.csv | awk 'BEGIN {FS=","; OFS=","} {print $1,"["$6,$7"]"}'

运算是 - ]ABC,[CD,EF

谢谢

4

2 回答 2

3

看起来这可能是一个行尾问题,因为您的行以CR/LF(回车和换行)而不是单独终止LF实际输出的是:

ABC,[CD,EF<CR>]

并且在输出最后一个字符CR之前强制光标回到行首。]

您可以通过以下方式看到类似的效果:

pax> awk -v x='abcdef^M' 'END {print "123 ["x"]"}' </dev/null
]23 [abcdef

其中 the^M实际上是一个CR字符,用 ,CTRL-V输入CTRL-M

至于如何修复它,您可以修复文件本身以摆脱狡猾的行尾,或者您可以gsub在行的最后一个字段上使用类似的东西来摆脱CR字符:

pax> # this bit here ----------vvvvvvvvvvvvvvvv
pax> awk -v x='abcdef^M' 'END {gsub("^M","",x);print "123 ["x"]"}' </dev/null
123 [abcdef]

在你的情况下,那将是:

awk 'BEGIN {FS=","; OFS=","} {gsub("^M","",$7);print $1,"["$6,$7"]"}' file.csv

请注意,cat file.csv |这里完全没有必要这样做,因为awk它本身完全能够处理文件名。我自己,如果可能的话,我宁愿修复文件。

有多种方法可以修复所述文件(取决于您可以使用哪些工具),请参阅这个出色的答案

于 2013-09-16T09:09:26.350 回答
1

您的代码适用于正确的输入,例如:

$ echo {A..J} | sed 's/ /,/g' | awk 'BEGIN {FS=","; OFS=","} {print $1,"["$6,$7"]"}'
A,[F,G]

正如强大的@paxdiablo 所说,可能是一个行尾问题。file使用- 命令检查

要转换为正确的行尾,请使用例如fromdosdos2unix

于 2013-09-16T09:13:19.683 回答