使用sed with node.js对文件的列进行排序
我有一个大文件,用一个制表符或逗号作为分隔符。我想以任何特定的顺序动态地重新排列此文件的列。我试过sed命令。它在命令行上运行良好,但尝试使用nodes exec时,它不起作用 命令行上使用的命令:(用于制表符分隔的文件) 按3,1,2顺序对列进行排序使用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 -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。我想在单击按钮时调用该功能。请建议可以执行的操作。谢谢