使用awk或sed排列列?

使用awk或sed排列列?,sed,awk,Sed,Awk,我有一个大约有500行和480K列的文件,我需要在末尾移动第2、3和4列。我的文件是一个逗号分隔的文件,有没有更快捷的方法来安排使用awk或sed 您可以轻松复制列,移动480K列需要的时间太长 $ awk 'BEGIN{FS=OFS=","} {print $0,$2,$3,$4}' input.file > output.file 这是一种什么样的数据格式?您可以轻松复制列,移动480K列所需的时间太长 $ awk 'BEGIN{FS=OFS=","} {print $0,$2,$3

我有一个大约有500行和480K列的文件,我需要在末尾移动第2、3和4列。我的文件是一个逗号分隔的文件,有没有更快捷的方法来安排使用awk或sed

您可以轻松复制列,移动480K列需要的时间太长

$ awk 'BEGIN{FS=OFS=","} {print $0,$2,$3,$4}' input.file > output.file

这是一种什么样的数据格式?

您可以轻松复制列,移动480K列所需的时间太长

$ awk 'BEGIN{FS=OFS=","} {print $0,$2,$3,$4}' input.file > output.file
这是什么样的数据格式?

使用5个字段进行测试:

$ cat foo
1,2,3,4,5
a,b,c,d,e
$ cat program.awk
{
    $6=$2 OFS $3 OFS $4 OFS $1  # copy fields to the end and $1 too
    sub(/^([^,],){4}/,"")       # remove 4 first columns
    $1=$5 OFS $1                # catenate current $5 (was $1) to $1 
    NF=4                        # reduce NF
} 1                             # print
运行它:

$ awk -f program.awk FS=, OFS=, foo
1,5,2,3,4
a,e,b,c,d
因此,理论上这应该是可行的:

{
    $480001=$2 OFS $3 OFS $4 OFS $1
    sub(/^([^,],){4}/,"")
    $1=$480000 OFS $1
    NF=479999 
} 1
编辑:它确实有效。

使用5个字段进行测试:

$ cat foo
1,2,3,4,5
a,b,c,d,e
$ cat program.awk
{
    $6=$2 OFS $3 OFS $4 OFS $1  # copy fields to the end and $1 too
    sub(/^([^,],){4}/,"")       # remove 4 first columns
    $1=$5 OFS $1                # catenate current $5 (was $1) to $1 
    NF=4                        # reduce NF
} 1                             # print
运行它:

$ awk -f program.awk FS=, OFS=, foo
1,5,2,3,4
a,e,b,c,d
因此,理论上这应该是可行的:

{
    $480001=$2 OFS $3 OFS $4 OFS $1
    sub(/^([^,],){4}/,"")
    $1=$480000 OFS $1
    NF=479999 
} 1
编辑:它确实有效。

也许是perl:

perl -F, -lane 'print join(",", @F[0,4..$#F,1,2,3])' file

另一种方法:正则表达式

perl -lpe 's/^([^,]+)(,[^,]+,[^,]+,[^,]+)(.*)/$1$3$2/' file

使用500行文件对其计时,每行包含480000个字段

$ time perl -F, -lane 'print join(",", @F[0,4..$#F,1,2,3])' file.csv > file2.csv
40.13user 1.11system 0:43.92elapsed 93%CPU (0avgtext+0avgdata 67960maxresident)k
0inputs+3172752outputs (0major+16088minor)pagefaults 0swaps

$ time perl -F, -lane '@x = splice @F, 1, 3; print join(",", @F, @x)' file.csv > file2.csv
34.82user 1.18system 0:38.47elapsed 93%CPU (0avgtext+0avgdata 52900maxresident)k
0inputs+3172752outputs (0major+12301minor)pagefaults 0swaps
纯文本操作是赢家

$ time perl -lpe 's/^([^,]+)(,[^,]+,[^,]+,[^,]+)(.*)/$1$3$2/' file.csv > file2.csv
4.63user 1.36system 0:20.81elapsed 28%CPU (0avgtext+0avgdata 20612maxresident)k
0inputs+3172752outputs (0major+149866minor)pagefaults 0swaps
也许perl:

perl -F, -lane 'print join(",", @F[0,4..$#F,1,2,3])' file

另一种方法:正则表达式

perl -lpe 's/^([^,]+)(,[^,]+,[^,]+,[^,]+)(.*)/$1$3$2/' file

使用500行文件对其计时,每行包含480000个字段

$ time perl -F, -lane 'print join(",", @F[0,4..$#F,1,2,3])' file.csv > file2.csv
40.13user 1.11system 0:43.92elapsed 93%CPU (0avgtext+0avgdata 67960maxresident)k
0inputs+3172752outputs (0major+16088minor)pagefaults 0swaps

$ time perl -F, -lane '@x = splice @F, 1, 3; print join(",", @F, @x)' file.csv > file2.csv
34.82user 1.18system 0:38.47elapsed 93%CPU (0avgtext+0avgdata 52900maxresident)k
0inputs+3172752outputs (0major+12301minor)pagefaults 0swaps
纯文本操作是赢家

$ time perl -lpe 's/^([^,]+)(,[^,]+,[^,]+,[^,]+)(.*)/$1$3$2/' file.csv > file2.csv
4.63user 1.36system 0:20.81elapsed 28%CPU (0avgtext+0avgdata 20612maxresident)k
0inputs+3172752outputs (0major+149866minor)pagefaults 0swaps

另一种技术,就是bash:

while IFS=, read -r a b c d e; do
    echo "$a,$e,$b,$c,$d"
done < file
当IFS=,read-ra b c d e;做
回声“$a、$e、$b、$c、$d”
完成<文件

另一种技术,就是bash:

while IFS=, read -r a b c d e; do
    echo "$a,$e,$b,$c,$d"
done < file
当IFS=,read-ra b c d e;做
回声“$a、$e、$b、$c、$d”
完成<文件

您可以尝试以下解决方案-

perl -F"," -lane 'print "@F[0]"," ","@F[4..$#F]"," ","@F[1..3]"' input.file

您可以尝试以下解决方案-

perl -F"," -lane 'print "@F[0]"," ","@F[4..$#F]"," ","@F[1..3]"' input.file

粘贴-d,比什么快?您的问题将显示您迄今为止所做的尝试,以及简洁、可测试的示例输入和预期输出。例如,提供一个。
粘贴-d,比什么更快?您的问题将显示您迄今为止所做的尝试,以及简洁、可测试的示例输入和预期输出。这是基因组数据,我们正在测试每个人的450K位置。这是基因组数据,我们正在测试每个人的450K位置。我的理解是它是480000列而不是480列。我的理解是它是480000列而不是480列。我最后写了一个Perl脚本来完成这项工作,但是我也可以检查一下。后一个一对一的记录,使用
time
计时480000 cols,平均速度要快一点。我最后编写了一个Perl脚本来完成这项工作,但我也可以检查这一点。后一个记录使用
time
计时480000 cols,平均速度稍快。它移动3,4和5到结尾并删除第二个。它移动3,4和5到结尾并删除第二个。