Linux剪切、粘贴

Linux剪切、粘贴,linux,awk,sed,paste,cut,Linux,Awk,Sed,Paste,Cut,我必须编写一个脚本文件来剪切以下列,并将其粘贴到新的.arff文件中同一行的末尾。我想文件类型并不重要 当前文件: 63,male,typ_angina,145,233,t,left_vent_hyper,150,no,2.3,down,0,fixed_defect,'<50' 67,male,asympt,160,286,f,left_vent_hyper,108,yes,1.5,flat,3,normal,'>50_1' male,typ_angina,145,233,t,le

我必须编写一个脚本文件来剪切以下列,并将其粘贴到新的.arff文件中同一行的末尾。我想文件类型并不重要

当前文件:

63,male,typ_angina,145,233,t,left_vent_hyper,150,no,2.3,down,0,fixed_defect,'<50'
67,male,asympt,160,286,f,left_vent_hyper,108,yes,1.5,flat,3,normal,'>50_1'
male,typ_angina,145,233,t,left_vent_hyper,150,no,2.3,down,0,fixed_defect,'<50',63
male,asympt,160,286,f,left_vent_hyper,108,yes,1.5,flat,3,normal,'>50_1',67
63,男性,典型型心绞痛,145233,t型,左心室超高,150,否,2.3,下降,0,固定缺陷,'50'1'
输出应为:

63,male,typ_angina,145,233,t,left_vent_hyper,150,no,2.3,down,0,fixed_defect,'<50'
67,male,asympt,160,286,f,left_vent_hyper,108,yes,1.5,flat,3,normal,'>50_1'
male,typ_angina,145,233,t,left_vent_hyper,150,no,2.3,down,0,fixed_defect,'<50',63
male,asympt,160,286,f,left_vent_hyper,108,yes,1.5,flat,3,normal,'>50_1',67
男性,典型心绞痛,145233,t型,左心室超高,150,否,2.3,向下,0,固定缺损,'50,1',67

我该怎么做?使用Linux脚本文件?

Shorterawk解决方案:

$ awk -F, '{$(NF+1)=$1;sub($1",","")}1' OFS=, input.txt
给出:

male,typ_angina,145,233,t,left_vent_hyper,150,no,2.3,down,0,fixed_defect,'<50',63
male,asympt,160,286,f,left_vent_hyper,108,yes,1.5,flat,3,normal,'>50_1',67
编辑:在你的问题之后阅读你的评论,看起来你交换了更多的列,而不仅仅是第一列到最后一行。您可以考虑使用多次调用的交换函数:

func swap(i,j){s=$i; $i=$j; $j=s}
但是,无论何时要将列移动到行尾,这都不起作用。让我们改变这个函数:

func swap(i,j){
    s=$i
    if (j>NF){
        for (k=i;k<NF;k++) $k=$(k+1)
        $NF=s
    } else {
        $i=$j
        $j=s
    }
}
func交换(i,j){
s=$i
如果(j>NF){
对于(k=i;kNF){

对于(k=i;kShorterawk溶液:

$ awk -F, '{$(NF+1)=$1;sub($1",","")}1' OFS=, input.txt
给出:

male,typ_angina,145,233,t,left_vent_hyper,150,no,2.3,down,0,fixed_defect,'<50',63
male,asympt,160,286,f,left_vent_hyper,108,yes,1.5,flat,3,normal,'>50_1',67
编辑:在你的问题后面阅读你的评论,看起来你比第一个到最后一行交换更多的列。你可以考虑使用多次调用的交换函数:

func swap(i,j){s=$i; $i=$j; $j=s}
但是,当您要将列移动到行的末尾时,这将不起作用。因此,让我们更改该函数:

func swap(i,j){
    s=$i
    if (j>NF){
        for (k=i;k<NF;k++) $k=$(k+1)
        $NF=s
    } else {
        $i=$j
        $j=s
    }
}
func交换(i,j){
s=$i
如果(j>NF){
对于(k=i;kNF){
for(k=i;k
简要说明

  • ^([^,]*)
    将匹配第一个用逗号分隔的字段,后面的
    \1
    表示匹配
  • (.*)$
    将是除第一个逗号之外的剩余标记部分,
    \2
    将引用匹配项
简要说明

  • ^([^,]*)
    将匹配第一个用逗号分隔的字段,后面的
    \1
    表示匹配
  • (.*)$
    将是除第一个逗号之外的剩余标记部分,
    \2
    将引用匹配项

为什么使用sed或awk,shell可以轻松处理此问题

while read l;do echo ${l#*,},${l%%,*};done <infile

在读取l;do echo${l#*,},${l%%,*};done时为什么使用sed或awk,shell可以轻松处理此问题

while read l;do echo ${l#*,},${l%%,*};done <infile

读取时,执行echo${l#*,},${l%%,*};完成。在谈到脚本时,它不称为“剪切”和“粘贴”。它称为移动数据或“转置”堆栈溢出也是编写代码的地方,但它不是工作的,它不是为您编写代码的服务。如果需要指导或指导,请尝试服务,比如,或“代码> AWK< /COD>和<代码> SED可以完成这项工作,但这并不是说它们是最好的工具。请考虑使用更友好的工具。比如Python、Ruby、Perl,甚至Node.js,它们都是大多数Linux发行版附带的。我已经能够使用awk'BEGIN{FS=“,”OFS=“,”}{print$2、$5、$3、$4、$5、$6、$7、$8、$9、$10、$11、$12、$13、$14、$1}交换列了'try.txt>try1.txt但是结果有一些问题,就像所有内容都打印在同一行中。不管怎样,谢谢you@PradeepPallegama,请编辑您的帖子。请尝试我的解决方案,并让我知道这是否对您有帮助。在谈到脚本时,这不是“剪切”和“粘贴”。这是“移动数据”,或“转置"堆栈溢出也是编写代码的地方,但它不是工作的,它不是为您编写代码的服务。如果需要指导或指导,请尝试服务,比如,或“代码> AWK< /COD>和<代码> SED可以完成这项工作,但这并不是说它们是最好的工具。请考虑使用更友好的工具。比如Python、Ruby、Perl,甚至Node.js,它们都是大多数Linux发行版附带的。我已经能够使用awk'BEGIN{FS=“,”OFS=“,”}{print$2、$5、$3、$4、$5、$6、$7、$8、$9、$10、$11、$12、$13、$14、$1}交换列了'try.txt>try1.txt但是结果有一些问题,就像所有内容都打印在同一行中。不管怎样,谢谢you@PradeepPallegama,请编辑您的帖子。请尝试我的解决方案,并让我知道这是否对您有帮助。现在我需要不带逗号的结果。我应该从以下位置更改什么:sed-e“s/^([^,]*),(.*)/\2\1/g”>temp1.txt代码?找到了解决方案。used tr“,”它可以工作整个脚本不改变任何数据集,谢谢!现在我需要不带逗号的结果。我应该更改什么:sed-e“s/^([^,]*),(.*)/\2\1/g“>temp1.txt代码?找到了解决方案。used tr“,”它的工作整个脚本的工作没有改变任何数据集,谢谢!