Пожалуйста, попробуйте что-то вроде:
awk -F, '{
x=$1;
if (!shown[x,$10]++)
ctry[x]=ctry[x]$10"%%% ";
if (!shown[x,$6]++)
nation[x]=nation[x]$6"%%% ";
a[x]=$1","$2","$3","$4","$5
b[x]=$7","$8","$9
}
END{
for(x in a){
gsub (/%%% $/,"",nation[x]);
gsub (/%%% $/,"",ctry[x]);
print a[x]","nation[x]","b[x]","ctry[x]"\n";
}
}' list.csv > final.csv
Вы увидите, что приведенный выше скрипт основан на сценарии OP с некоторыми реорганизациями и модификациями. Пункт - линия: if (!shown[x,$10]++)
и следующая подобная, которая избегает дублирования.
Не волнуйтесь об этом. Не позволяется когда-либо оптимизировать что-либо, что может иметь значение к Вашей системе (за исключением скорости). Если Вы новый объект, код называют, память выделяется, это должно работать.
Если бы Вам защитили его, если (ложь), где ложь является финалом, она могла быть оптимизирована из системы полностью, то это могло обнаружить, что метод ничего не делает и оптимизирует IT (в теории).
Править: между прочим, может также быть достаточно умно решить что этот метод:
newIfTrue(boolean b) {
if(b)
new ThisClass();
}
ничего не будет всегда делать, если b будет ложью, и в конечном счете выясните, что однажды в Вашем коде B всегда является ложью, и скомпилируйте эту стандартную программу из того кода полностью.
Это - то, где JIT может сделать материал, это фактически невозможно на любом неуправляемом языке.
Думайте об этом этот путь:
Позволяет предполагают, что компилятор может решить, что граф вызовов не имеет никаких побочных эффектов (я не думаю, что это возможно, я неопределенно помню что-то о P=NP от моих курсов CS). Это оптимизирует любой метод, который не имеет побочных эффектов. Так как большинство тестов не имеет и не должно иметь никаких побочных эффектов затем, компилятор может оптимизировать их всех далеко.
Я думаю, волнуетесь ли Вы по поводу этого оптимизируемый далеко, можно делать немного излишества тестирования.
На статическом языке я склонен думать о компиляторе как о тесте. Если это передает компиляцию, которая означает, что определенные вещи там (как методы). Если у Вас нет другого теста, который осуществляет Вашего конструктора по умолчанию (который докажет его, привычка выдает исключения), можно хотеть думать о том, почему Вы пишете что конструктор по умолчанию во-первых (YAGNI и все это).
Я знаю, что существуют люди, которые не соглашаются со мной, но я чувствую, что этот вид вещи - просто что-то, что чрезмерно увеличит размер Вашего количества тестов ни по какой полезной причине, даже смотря на него через защитные очки TDD.
Почему это должно иметь значение? Если компилятор/JIT может статически определить, не утверждает, будут пораженными (который мог бы вызвать побочные эффекты), то Вы в порядке.
Кажется, что в C# я мог сделать это:
[Test]
public void testDefaultConstructor() {
GC.KeepAlive(new MyObject());
}
AFAIU, GC.KeepAlive
метод не будет встроен JIT, таким образом, код, как будут гарантировать, будет работать как ожидалось. Однако я не знаю подобную конструкцию в Java.
Каждый ввод-вывод является побочным эффектом, таким образом, можно просто поместить
Object obj = new MyObject();
System.out.println(obj.toString());
и Вы в порядке.