Linux剪切,粘贴

时间:2017-10-06 02:44:59

标签: 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,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

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

4 个答案:

答案 0 :(得分:0)

关注awk可以帮助你。

awk -F, '{gsub(/\r/,"");$(NF+1)=$1;sub(/[^,]*/,"");sub(/^,/,"");} 1' OFS=,  Input_file

输出如下。

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

编辑: 虽然awk解决方案应该最符合您的要求,如果您想使用剪切,您也可以使用以下。

tr -d '\r' < Input_file | paste -d"," <(cut -d, -f2-  Input_file) <(cut -d, -f1  Input_file)

输出如下。

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

答案 1 :(得分:0)

更短的 awk 解决方案:

$ 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

说明:

{$(NF+1)=$1        # add extra field with value of field $1
 sub($1",","")     # search for string "$1," in $0, replace it with ""
}1                 # print $0

编辑:在您的问题后阅读您的评论,看起来您交换的列数多于第一行到结尾的列数。您可以考虑使用多次调用的交换函数:

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

所以现在你可以这样做:

$ cat tst.awk
BEGIN{FS=OFS=","}
{swap(1,NF+1); swap(2,5)}1
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
    }
}

 $ awk -f tst.awk input.txt
male,t,145,233,typ_angina,left_vent_hyper,150,no,2.3,down,0,fixed_defect,'<50',63
male,f,160,286,asympt,left_vent_hyper,108,yes,1.5,flat,3,normal,'>50_1',67

答案 2 :(得分:0)

sed -r 's/^([^,]*),(.*)$/\2,\1/' Input_file

简要说明,

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

答案 3 :(得分:0)

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

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

如果是带\ r

的获胜文件
while read l;do f=${l%[[:cntrl:]]};echo ${f#*,},${l%%,*};done <infile

如果您想保留文件。

printf "%s" "$(while read l;do f=${l%[[:cntrl:]]};printf "%s\n" "${f#*,},${l%%,*}";done <infile)">infile