Найдите номер в 'txt A' и замените в CSV-файл.

Вы также можете:

# su user

как root, чтобы стать этим пользователем и видеть его файлы

0
09.03.2020, 15:21
1 ответ
$ 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в командной строке ).

4
28.04.2021, 23:21

Теги

Похожие вопросы