Unix剪切:将同一字段打印两次



假设我有文件-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(为什么?什么奇怪的系统有cutsed但没有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不支持字段重复。

您可以组合cutsed,例如,如果重复的元素在末尾:

< 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'

最新更新