我对Linux环境有些新意.我全神贯过地寻找答案 - 如果之前有人问过这个道歉.
我写了一个awk脚本,它运行在一个大文本文件上(11个演出,40列,48M行).该脚本称为"cycle.awk".它用新版本替换列.它要求数据首先由该特定列排序.为了在所有列上运行脚本,我写了一个像这样的bash命令:
cat input.csv |
sort -k 22 -t "," | awk -v val=22 -f cycle.awk |
sort -k 23 -t "," | awk -v val=23 -f cycle.awk |
sort -k 24 -t "," | awk -v val=24 -f cycle.awk |
sort -k 25 -t "," | awk -v val=25 -f cycle.awk |
sort -k 26 -t "," | awk -v val=26 -f cycle.awk |
sort -k 27 -t "," | awk -v val=27 -f cycle.awk |
sort -k 28 -t "," | awk -v val=28 -f cycle.awk |
sort -k 29 -t "," | awk -v val=29 -f cycle.awk |
sort -k 30 -t "," | awk -v val=30 -f cycle.awk |
sort -k 31 -t "," | awk -v val=31 -f cycle.awk |
sort -k 32 -t "," | awk -v val=32 -f cycle.awk |
sort -k 33 -t "," | awk -v val=33 -f cycle.awk |
sort -k 34 -t "," | awk -v val=34 -f cycle.awk |
sort -k 35 -t "," | awk -v val=35 -f cycle.awk |
sort -k 36 -t "," | awk -v val=36 -f cycle.awk |
sort -k 37 -t "," | awk -v val=37 -f cycle.awk |
sort -k 38 -t "," | awk -v val=38 -f cycle.awk |
sort -k 39 -t "," | awk -v val=39 -f cycle.awk |
sort -k 40 -t "," | awk -v val=40 -f cycle.awk |
sort -k 41 -t "," | awk -v val=41 -f cycle.awk > output.csv
Run Code Online (Sandbox Code Playgroud)
我认为必须有一种更优雅的方式来做到这一点.如何编写一个bash脚本,允许我传递我想要应用我的awk脚本的列,然后运行这种管道程序而不需要生成任何临时数据文件?我正在避免临时文件,因为输入文件太大而且我对最佳性能感兴趣.
顺便说一下,脚本如下.它基本上缩短了某些列的值,以便压缩文本文件.有关如何收紧它的任何指示?此过程大约需要10个小时才能运行.
BEGIN{ FS=","; OFS=","; count=1 }
NR == 1 { temp=$val }
{
if ( temp != $val ) {
temp=$val;
count++;
}
$val=count
print $0
}
Run Code Online (Sandbox Code Playgroud)
输入通常看起来像这样:
id,c1
1,abcd
2,efgh
3,abcd
4,abcd
5,efgh
Run Code Online (Sandbox Code Playgroud)
相应的输出将是:
id,c1
1,1
2,2
3,1
4,1
5,2
Run Code Online (Sandbox Code Playgroud)
从技术上讲,它将按c1排序,但这不是重点.
真正的正确答案是重写您的过程,不需要这种管道.但是,如果您确实想要设置这样的管道,请使用递归函数(管道自身):
process_column() {
sort -k "$1" -t, | awk -v val="$1" -f cycle.awk
}
process_column_range() {
local min_col=$1
local max_col=$2
if (( min_col < max_col )); then
process_column "$min_col" \
| process_column_range "$(( min_col + 1 ))" "$max_col"
else
process_column "$min_col"
fi
}
Run Code Online (Sandbox Code Playgroud)
...然后,调用(注意cat不需要):
process_column_range 22 41 <input.csv >output.csv
Run Code Online (Sandbox Code Playgroud)