Строки в Java неизменяемы. Это означает, что всякий раз, когда вы пытаетесь изменить / изменить строку, вы получаете новый экземпляр. Вы не можете изменить исходную строку. Это сделано для того, чтобы эти экземпляры строк могли кэшироваться. Типичная программа содержит множество ссылок на строки и кеширование этих экземпляров, что может уменьшить объем памяти и увеличить производительность программы.
При использовании оператора == для сравнения строк вы не сравниваете содержимое строки , но фактически сравнивают адрес памяти. Если они равны, в противном случае они вернут true и false. Если значение равно в строке, сравнивает содержимое строки.
Итак, вопрос в том, что все строки кэшируются в системе, как получается ==
возвращает false, тогда как equals возвращает true? Ну, это возможно. Если вы создадите новую строку, например String str = new String("Testing")
, вы создадите новую строку в кеше, даже если в кеше уже содержится строка с тем же содержимым. Короче говоря, "MyString" == new String("MyString")
всегда будет возвращать false.
Java также говорит о функции intern (), которая может использоваться в строке, чтобы сделать ее частью кеша, поэтому "MyString" == new String("MyString").intern()
вернет true.
Примечание: == оператор намного быстрее, чем равен только потому, что вы сравниваете два адреса памяти, но вы должны быть уверены, что код не создает новые экземпляры String в коде. В противном случае вы столкнетесь с ошибками.
Нет необходимости делать это так, просто awk читает два файла, это нормально:
awk -F, 'NR==FNR{a[$1]++;next;}a[$1]{$5="Y"}1' file1.csv file2.csv
Не уверены, что заголовок и вторая строка - это ваш способ объяснения, если вы хотите избавиться от них :
awk -F, 'NR==FNR{a[$1]++;next;}a[$1]{$5="Y"}FNR>2' file1.csv file2.csv
Обратите внимание, что если file1.csv может быть пустым, вы должны изменить NR==FNR
на другие методы проверки файлов, такие как ARGIND==1
для GNU awk, или FILENAME=="file1.csv"
и т. Д.
a[$1]++
на a[$1]=1
немного улучшит скорость. a
, когда FNR>1
или FNR>2
. Усовершенствуйте команду самостоятельно, я уверен, что вы поняли;)
NR==FNR
означает первый файл, потому что NR
означает N число от R записей теперь FNR
означает текущий F иле N номер R экордов.
a
- это массив для сохранения $1
в качестве ключей.
next
пропустить выполнение другого блока.
Когда NR==FNR
равно false, это означает, что это не первый файл, первый блок не будет выполнен.
(Вы также можете использовать NR>FNR
перед блоком, чтобы указать его, но так как я использовал next
в блоке NR==FNR
, так что в этом нет необходимости.)
Затем запускаются другие директивы, a[$1]
заключается в том, чтобы судить, существует ли ключ в массиве a
или нет (если обратиться к значению, буквально проверьте, что key exists
фактически должно быть $1 in a
), если он существует, то измените $ 5.
Последний 1
должен указывать истинное значение, это сокращение для {print}
.
(Поскольку выражение без блока подразумевает {print}
, и блок выполняется, когда вышеприведенное выражение рассчитывается как true
, для которого 1
всегда верно.)
Вы можете попробовать решение Perl
$ perl -F, -lane 'BEGIN {%kv=map{chomp; Вы можете попробовать решение Perl
[110].=>1} qx(cat file1.csv) } print " Вы можете попробовать решение Perl
[110].", $kv{$F[0]}? "Y" : "" ' file2.csv
aaa,2,3,4,Y
aaa,2,3,4,Y
bbb,2,3,4,
ccc,2,3,4,
ccc,2,3,4,
ddd,2,3,4,Y
ddd,2,3,4,Y
ddd,2,3,4,Y
eee,2,3,4,
fff,2,3,4,Y
ggg,2,3,4,Y
hhh,2,3,4,
hhh,2,3,4,
$ cat file1.csv
aaa
ddd
fff
ggg
$ cat file2.csv
aaa,2,3,4,
aaa,2,3,4,
bbb,2,3,4,
ccc,2,3,4,
ccc,2,3,4,
ddd,2,3,4,
ddd,2,3,4,
ddd,2,3,4,
eee,2,3,4,
fff,2,3,4,
ggg,2,3,4,
hhh,2,3,4,
hhh,2,3,4,
$
.