假设我有文件-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
这意味着剪切只能打印一个字段一次。我需要打印同一个字段两次或n次。我为什么需要这个(可选阅读)啊。说来话长。我有一个类似的文件
#,#,-,-
#,#,#,#,#,#,#,-
#,#,#,-
我必须把这个秘密交给
#,#,-,-,-,-,-
#,#,#,#,#,#,#,-
#,#,#,-,-,-,-
这里的"#"one_answers"-"分别表示不同的数值数据。谢谢
同一字段不能打印两次。cut
按顺序打印字段(或字符或字节)的选择。请参阅在单个命令中组合两个不同的切割输出?对于一些非常相似的请求,使用剪切命令重新排序字段/字符。
如果您的CSV字段周围没有引号,那么这里使用的正确工具是awk。
awk -F , -v OFS=, '{print $1, $4, $4}'
如果你不想使用awk(为什么?什么奇怪的系统有cut
和sed
但没有awk
?),你可以使用sed(仍然假设你的CSV字段周围没有引号)。匹配前四个逗号分隔的字段,然后按所需顺序选择所需字段。
sed -e 's/^([^,]*),([^,]*),([^,]*),([^,]*)/1,4,4/'
$ sed 's/,.*,/,/; s/(,.*)/11,/' a.csv
ram,doc,doc,
shaym,eng,eng,
它的作用:
- 仅用逗号替换第一个逗号和最后一个逗号之间的所有内容
- 重复最后一个",something"部分并加上逗号。瞧
假设:
- 您需要第一个字段,然后是最后一个字段的两倍
- 第一个和最后一个字段中没有转义逗号
为什么您需要这个输出?:-)
使用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
正如其他人所指出的,cut
不支持字段重复。
您可以组合cut
和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,
我也遇到了同样的问题,但我没有将所有列添加到awk,而是使用(复制第二列):
awk -v OFS='t' '$2=$2"t"$2' # for tab-delimited files
对于CSV,您可以只使用
awk -F , -v OFS=, '$2=$2","$2'