基于两列对目录中的多个csv文件进行排序

时间:2015-12-04 05:20:44

标签: r bash csv sed

我在名为.csv的目录中有多个mydirectory个文件。我想首先使用一些bash / awk / sed命令对所有这些文件进行排序,首先基于LeftChr列,然后是RightChr列,然后获取result

  >Id  LeftChr  LeftPosition  LeftStrand  LeftLength  RightChr  RightPosition  RightStrand
1979     chr1        825881           -         252      chr2        5726723            -
5480     chr2        826313           +         444      chr2        5727501            +
5492     chr5        869527           +         698      chr2         870339            +
1980     chr2       1584550           -         263      chr1        1651034            -
5491    chr14       1685863           +         148      chr1        1686679            +
5490     chr1       1691382           +         190      chr1        1693020            +

结果

  >Id  LeftChr  LeftPosition  LeftStrand  LeftLength  RightChr  RightPosition  RightStrand
5490     chr1       1691382           +         190      chr1        1693020            +
1979     chr1        825881           -         252      chr2        5726723            -
1980     chr2       1584550           -         263      chr1        1651034            -
5480     chr2        826313           +         444      chr2        5727501            +
5492     chr5        869527           +         698      chr2         870339            +
5491    chr14       1685863           +         148      chr1        1686679            +

5 个答案:

答案 0 :(得分:1)

这可能适合你(GNU sed and sort):

sed '1b;/Id/d;s/chr//g' mydirectory/*.csv |
sort -k2,2n -k6,6n |
sed '1b;s/\S\+/chr&/2;s/\S\+/chr&/6' > outputFile

这会丢弃除第一个标头之外的所有标头,并从所有文件中删除文字chr。随后的文件通过管道输入到第二和第六个字段以数字方式对文件进行排序。这个转换通过管道传输到最终的sed命令,该命令忽略第一行(标题行)并替换第二和第六个字段中的文字chr

答案 1 :(得分:1)

(function () {
'use strict';

angular
.module('com.module.users')
.controller('UserCtrl', UserCtrl);

UserCtrl.$inject = ['$state', '$rootScope', 'ENV', 'DTOptionsBuilder', 'DTColumnBuilder'];
function UserCtrl($state, $rootScope, ENV, DTOptionsBuilder, DTColumnBuilder) {
var vm = this;

vm.currentPageState = $state.current.stateDesc;

vm.dtOptions = DTOptionsBuilder.newOptions()
  .withOption('ajax', {
    url: ENV.apiUrl + vm.currentPageState.rUrl + '/users',
    type: 'POST',
    headers: {
      Authorization: 'Bearer ' + $rootScope.globals.currentAdmin.token
    }
  })
  .withDataProp('data')
  .withOption('processing', true)
  .withOption('serverSide', true)
  .withPaginationType('full_numbers')
  .withBootstrap()
  .withColumnFilter({
    aoColumns: [{
      type: 'text',
      bRegex: true,
      bSmart: true
    }, {
      type: 'text',
      bRegex: true,
      bSmart: true
    }, {
      type: 'text',
      bRegex: true,
      bSmart: true
    }, {
      type: 'text',
      bRegex: true,
      bSmart: true
    }]
  });

vm.dtColumns = [
  DTColumnBuilder.newColumn('firstName').withTitle('First name'),
  DTColumnBuilder.newColumn('lastName').withTitle('Last name'),
  DTColumnBuilder.newColumn('email').withTitle('Email ID'),
  DTColumnBuilder.newColumn('phone').withTitle('Phone Number')
];
}

})();

是啊,这种模式不会成为

答案 2 :(得分:0)

假设您可以访问合理的计算环境,以下内容应为您尝试执行的操作提供基础:

in=input.txt; head -n 1 "$in"; tail -n +2 "$in" | sort -k2,2 -k6,6 

但是有几个潜在的问题。一个是您发布的输入文件不是通常意义上的“CSV”文件。另一个是你是否想要“稳定排序”。

答案 3 :(得分:0)

将其加载到r

result <- yourdataname[order(,yourdataname[,LeftChr], yourdataname[,RightChr])] 

如果您在数据集中有NA:

result <- yourdataname[order(yourdataname[,"LeftChr"],yourdataname[,"RightChr"], na.last = NA),]

答案 4 :(得分:0)

上述答案都不适用于我,但能够通过这样的方式完成。

for x in *.csv; do grep -v "^>" *.csv | sort -k2,2V -k6,6V -k3,3n -t $','<"$x" >"$x.tmp" mv "$x.tmp" "$x" done