我必须编写一个脚本文件来剪切以下列并将其粘贴到新的.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脚本文件?
答案 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