Вы также можете:
# su user
как root, чтобы стать этим пользователем и видеть его файлы
$ awk -F, 'FNR==NR { data[$1]=1; next } $1 in data { $0 = "//" $0 }; 1' 'File A.txt' 'File B.txt'
500,5,4,8,,,
5535,5,4,6069,,,
2121,5,4,8,,,
//5844,5,4,5844,,,
//6069,5,4,8,,,
Здесь я сначала читаю числа из File A.txt
как ключи в ассоциативном массиве data
. Затем я проверяю каждое первое поле из File B.txt
, чтобы увидеть, является ли оно ключом в data
или нет. Если это так, я добавляю //
к текущей строке. Затем печатаются все строки, независимо от того, изменены они или нет.
Тест FNR==NR
всегда будет верен только при чтении из первого файла в командной строке, и блок заканчивается с next
. Это означает, что первый блок выполняется только для первого файла, а второй блок выполняется для второго файла, если первое поле является ключом в массиве data
.
1
в конце запускает выход и может быть заменен на { print }
.
Приведенное выше только добавит//
к строкам во вторых файлах, соответствующих номерам в первом файле. Чтобы также удалить//
из строк , не совпадающих (, т.е. обработать ваш обновленный вопрос):
$ cat 'File B.txt'
// some comment
// some explanation
100,5,3,8,,,
500,5,44,8,,,
//2500,5,2,8,,,
2121,5,2,8,,,
5535,5,4,6069,,,
5844,1,4,5844,,,
5900,5,2,8,,,
6069,5,4,8,,,
$ awk -F, 'FNR==NR { data[$1]=1; next } FNR > 2 { if ($1 in data) $0 = "//" $0; else sub("^//","") }; 1' 'File A.txt' 'File B.txt'
// some comment
// some explanation
100,5,3,8,,,
500,5,44,8,,,
2500,5,2,8,,,
2121,5,2,8,,,
5535,5,4,6069,,,
//5844,1,4,5844,,,
5900,5,2,8,,,
//6069,5,4,8,,,
Команда awk
предполагает, что вы хотите передать первые две строки File B.txt
через неизмененный (это то, о чем позаботится тест FNR > 2
). Блок FNR > 2
проверяет, является ли число ключом в data
или нет, и если это так, то строка закомментируется, но если это не так, любой //
в начале строки удаляется с помощью sub()
.
Вместо FNR > 2
вы можете использовать /^\/\/ /
для проверки комментария вверху файла. Это потребовало бы, чтобы все такие комментарии всегда начинались с //
, за которым следовал пробел.
Специальные переменные NR
и FNR
содержат общее количество прочитанных строк(NR
)и в текущем файле(FNR
).
Запятые «исчезли бы», если бы я изменил только первое поле с помощью $1 = "//" $1
, так как это повторно -сформировало бы запись, используя текущее значениеOFS
(пробела по умолчанию ). Вы можете предотвратить это, используя BEGIN { OFS=FS }
,который установит OFS
в символ запятой (или любой другой символ, который вы используете с -F
в командной строке ).