13

说我有文件 - a.csv

ram,33,professional,doc
shaym,23,salaried,eng

现在我需要这个输出(请不要问我为什么)

ram,doc,doc,
shayam,eng,eng,

我正在使用剪切命令

cut -d',' -f1,4,4 a.csv

但输出仍然存在

ram,doc
shyam,eng

这意味着cut只能打印一次 Field。我需要将同一字段打印两次或n次。 为什么我需要这个?(可选读)啊。说来话长。我有这样的文件

#,#,-,-
#,#,#,#,#,#,#,-
#,#,#,-

我必须把它隐藏起来

#,#,-,-,-,-,-
#,#,#,#,#,#,#,-
#,#,#,-,-,-,-

这里每个“#”和“-”指的是不同的数字数据。谢谢。

4

5 回答 5

11

您不能两次打印相同的字段。cut按顺序打印选择的字段(或字符或字节)。请参阅在单个命令中组合 2 个不同的剪切输出?对于一些非常相似的请求,使用 cut 命令重新排序字段/字符。

如果您的 CSV 在字段周围没有引号,则此处使用的正确工具是 awk。

awk -F , -v OFS=, '{print $1, $4, $4}'

如果您不想使用 awk (为什么?有什么奇怪的系统cutsed没有awk?),您可以使用 sed (仍然假设您的 CSV 字段周围没有引号)。匹配前四个以逗号分隔的字段,然后按所需顺序选择所需的字段。

sed -e 's/^\([^,]*\),\([^,]*\),\([^,]*\),\([^,]*\)/\1,\4,\4/'
于 2012-09-13T11:39:52.893 回答
1
$ sed 's/,.*,/,/; s/\(,.*\)/\1\1,/' a.csv
ram,doc,doc,
shaym,eng,eng,

这是做什么的:

  • 用逗号替换第一个和最后一个逗号之间的所有内容
  • 重复最后一个“,某事”部分并加上逗号。瞧!

做出的假设:

  • 你想要第一个字段,然后是最后一个字段的两倍
  • 第一个和最后一个字段中没有转义逗号

为什么你需要这个输出?:-)

于 2012-09-13T11:33:21.097 回答
1

正如其他人所指出的,cut不支持字段重复。

您可以组合cutand sed,例如,如果重复元素位于末尾:

< a.csv cut -d, -f1,4 | sed 's/,[^,]*$/&&,/'

输出:

ram,doc,doc,
shaym,eng,eng,

编辑

要使重复变量,您可以执行以下操作(假设您有 coreutils 可用):

n=10
rep=$(seq $n | sed 's:.*:\&:' | tr -d '\n')
< a.csv cut -d, -f1,4 | sed 's/,[^,]*$/'"$rep"',/'

输出:

ram,doc,doc,doc,doc,doc,doc,doc,doc,doc,doc,
shaym,eng,eng,eng,eng,eng,eng,eng,eng,eng,eng,
于 2012-09-13T12:53:25.053 回答
1

使用 perl:

perl -F, -ane 'chomp($F[3]);$a=$F[0].",".$F[3].",".$F[3];print $a."\n"' your_file

使用 sed:

sed 's/\([^,]*\),.*,\(.*\)/\1,\2,\2/g' your_file
于 2012-09-13T13:01:04.517 回答
0

我遇到了同样的问题,但我没有将所有列添加到 awk,而是使用(复制第二列):

awk -v OFS='\t' '$2=$2"\t"$2' # for tab-delimited files

对于 CSV,您可以使用

awk -F , -v OFS=, '$2=$2","$2'

于 2018-02-01T22:49:49.640 回答