Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用sed with node.js对文件的列进行排序_Node.js - Fatal编程技术网

使用sed with node.js对文件的列进行排序

使用sed with node.js对文件的列进行排序,node.js,Node.js,我有一个大文件,用一个制表符或逗号作为分隔符。我想以任何特定的顺序动态地重新排列此文件的列。我试过sed命令。它在命令行上运行良好,但尝试使用nodes exec时,它不起作用 命令行上使用的命令:(用于制表符分隔的文件) 按3,1,2顺序对列进行排序 sed -i -e 's@\(.*\)\t\(.*\)\t\(.*\)@\3\t\1\t\2@g' file_tab_header.txt sed -i -e 's/\(.*\)\t\(.*\)\t\(.*\)/\3\t\1\t\2/' fil

我有一个大文件,用一个制表符或逗号作为分隔符。我想以任何特定的顺序动态地重新排列此文件的列。我试过sed命令。它在命令行上运行良好,但尝试使用nodes exec时,它不起作用

命令行上使用的命令:(用于制表符分隔的文件) 按3,1,2顺序对列进行排序

sed -i -e 's@\(.*\)\t\(.*\)\t\(.*\)@\3\t\1\t\2@g' file_tab_header.txt

sed -i -e 's/\(.*\)\t\(.*\)\t\(.*\)/\3\t\1\t\2/' file_tab_header.txt
上述命令在命令行上运行良好


示例节点js代码:- 我尝试过许多变体,但没有一个能与exec一起使用。非常感谢您的帮助


谢谢

你可以考虑使用这样的脚本:

var fs = require('fs'),
    file = './test.txt',
    //order = [2, 1, 0],
    separator = ' ';

function parse_line(lines, order, separator, callback, i, output) {
    if(!i) {i = 0;}
    if(!output) {output = '';}
    console.log('line: ' + lines[i]);
    var line,
        j = 0,
        o = [],
        s = '';

    if (i < lines.length) {
        line = lines[i].split(separator);
        while (j < line.length) {
            o[order[j]] = line[j].trim();
            j = j + 1;
        }
        s = o.join(separator);
        console.log('+> ' + s);
        output = output + s + '\n';
        parse_line(lines, order, separator, callback, i + 1, output);
    } else {
        callback(output);
    }
}

function parse_file(file, order, separator, callback) {
    fs.readFile(file, function (err, data) {
        if(err) {
            console.log(err);
            callback(null);
        } else {
            data = '' + data;

            lines = String(data).split('\n');
            parse_line(lines, order, separator, function (output) {
                callback(output);
            });
        }
    });
}

function get_order(callback) {
    var i = 2,
        order = [];
    while (i < process.argv.length) {
        order.push(parseInt(process.argv[i]));
        i = i + 1;
    }
    callback(order);
}

get_order (function (order) {
    parse_file(file, order, separator, function (output) {
        console.log(output);
    });
});
结果:

E:\Documents\GIT\stackoverflow>node test.js 0 1 2
line: 1 2 3
+> 1 2 3
line: 4 5 6
+> 4 5 6
line: 7 8 9
+> 7 8 9
line: undefined
1 2 3
4 5 6
7 8 9


E:\Documents\GIT\stackoverflow>node test.js 1 2 0
line: 1 2 3
+> 3 1 2
line: 4 5 6
+> 6 4 5
line: 7 8 9
+> 9 7 8
line: undefined
3 1 2
6 4 5
9 7 8


E:\Documents\GIT\stackoverflow>node test.js 2 1 0
line: 1 2 3
+> 3 2 1
line: 4 5 6
+> 6 5 4
line: 7 8 9
+> 9 8 7
line: undefined
3 2 1
6 5 4
9 8 7


E:\Documents\GIT\stackoverflow>node test.js 0 2 1
line: 1 2 3
+> 1 3 2
line: 4 5 6
+> 4 6 5
line: 7 8 9
+> 7 9 8
line: undefined
1 3 2
4 6 5
7 9 8

<>你可以考虑使用这样的脚本:

var fs = require('fs'),
    file = './test.txt',
    //order = [2, 1, 0],
    separator = ' ';

function parse_line(lines, order, separator, callback, i, output) {
    if(!i) {i = 0;}
    if(!output) {output = '';}
    console.log('line: ' + lines[i]);
    var line,
        j = 0,
        o = [],
        s = '';

    if (i < lines.length) {
        line = lines[i].split(separator);
        while (j < line.length) {
            o[order[j]] = line[j].trim();
            j = j + 1;
        }
        s = o.join(separator);
        console.log('+> ' + s);
        output = output + s + '\n';
        parse_line(lines, order, separator, callback, i + 1, output);
    } else {
        callback(output);
    }
}

function parse_file(file, order, separator, callback) {
    fs.readFile(file, function (err, data) {
        if(err) {
            console.log(err);
            callback(null);
        } else {
            data = '' + data;

            lines = String(data).split('\n');
            parse_line(lines, order, separator, function (output) {
                callback(output);
            });
        }
    });
}

function get_order(callback) {
    var i = 2,
        order = [];
    while (i < process.argv.length) {
        order.push(parseInt(process.argv[i]));
        i = i + 1;
    }
    callback(order);
}

get_order (function (order) {
    parse_file(file, order, separator, function (output) {
        console.log(output);
    });
});
结果:

E:\Documents\GIT\stackoverflow>node test.js 0 1 2
line: 1 2 3
+> 1 2 3
line: 4 5 6
+> 4 5 6
line: 7 8 9
+> 7 8 9
line: undefined
1 2 3
4 5 6
7 8 9


E:\Documents\GIT\stackoverflow>node test.js 1 2 0
line: 1 2 3
+> 3 1 2
line: 4 5 6
+> 6 4 5
line: 7 8 9
+> 9 7 8
line: undefined
3 1 2
6 4 5
9 7 8


E:\Documents\GIT\stackoverflow>node test.js 2 1 0
line: 1 2 3
+> 3 2 1
line: 4 5 6
+> 6 5 4
line: 7 8 9
+> 9 8 7
line: undefined
3 2 1
6 5 4
9 8 7


E:\Documents\GIT\stackoverflow>node test.js 0 2 1
line: 1 2 3
+> 1 3 2
line: 4 5 6
+> 4 6 5
line: 7 8 9
+> 7 9 8
line: undefined
1 3 2
4 6 5
7 9 8


当你说它不起作用时,你是什么意思?斯特德,有什么发现吗?文件没有更改吗?以另一种方式改变?回调从未被调用?@DrakaSAN-Hi,预期的结果是,该文件应该被修改。该列应按照所述顺序重新排列。但事实并非如此。它没有显示任何错误。您能提供一个示例输入文件,以及该输入文件的预期结果吗?@DrakaSAN,我无法发布我想要的内容,因此我在上面的问题中添加了一个图像。请检查一下。输入及其所需的输出。谢谢当你说它不起作用时,你是什么意思?斯特德,有什么发现吗?文件没有更改吗?以另一种方式改变?回调从未被调用?@DrakaSAN-Hi,预期的结果是,该文件应该被修改。该列应按照所述顺序重新排列。但事实并非如此。它没有显示任何错误。您能提供一个示例输入文件,以及该输入文件的预期结果吗?@DrakaSAN,我无法发布我想要的内容,因此我在上面的问题中添加了一个图像。请检查一下。输入及其所需的输出。谢谢hanks@DrakaSAN,我会检查上面的代码。如果其他任何人可以通过node查看sed选项,这将非常有帮助。它适用于订单0,1,2。0,2,1. 但当我把它改成2,1,0或1,2,0时,它就不起作用了(刚刚尝试过,为我工作。它只是打印了一个想法,如果这是问题所在,你需要编写文件@DrakaSAN,我再次交叉检查了它。它不适用于订单12 0行:1 2 3输出应该是2 3 1,但它显示3 1 2Hi@DrakaSAN,我找到了这个模块。这工作正常。但唯一的问题是浏览器显示中止如果脚本是通过ajax调用的状态。我想在单击按钮时调用功能。请建议可以做什么。谢谢Hanks@DrakaSAN,我将检查上面的代码。如果其他人可以通过node查看sed选项,这将非常有帮助。您好@DrakaSAN,我使用了您的代码,但它并不每次都有效。它对r顺序为0,1,2.0,2,1。但当我将其更改为2,1,0或1,2,0时,它不起作用(刚刚尝试过,为我工作。它只是打印了一个想法,如果这是问题所在,你需要编写文件@DrakaSAN,我再次交叉检查了它。它不适用于订单12 0行:1 2 3输出应该是2 3 1,但它显示3 1 2Hi@DrakaSAN,我找到了这个模块。这工作正常。但唯一的问题是浏览器显示中止如果脚本是通过ajax调用的,则为status。我想在单击按钮时调用该功能。请建议可以执行的操作。谢谢