У меня есть Более 100 файлов, начинающихся с тире ( -
). Мне нужно знать, как сделать две вещи:
Пример: -20200622_142237.jpg
(Расширения файлов различаются, но все есть тире в начале.)
Как мне перечислить ( ls
) файлы, которые начинаются с этого тире? Кажется, Bash думает, что я пытаюсь использовать другой параметр. Я пробовал использовать одиночный кавычки, двойные кавычки и - впереди. Кажется, ничего не работает.
Как мне переименовать все эти файлы одновременно? Намерение состоит в том, чтобы переименовать их без тире в начале.
ПРИМЕЧАНИЕ: Я не хочу менять подчеркивание ( _
). Я просто хочу удалить тире ( -
) в начале файла.
Наконец, я ' Мы уже пробовали это возможное решение , опубликованное ранее, но оно не работает.
-121 --- 857 351-У меня есть два файла, содержимое которых:
Файл 1:
ATOM 1 N LEU 1 -10.186 -21.276 -0.497 1.00 0.00 PROT
ATOM 2 HT1 LEU 1 -10.773 -22.005 -0.843 1.00 0.00 PROT
ATOM 3 HT2 LEU 1 -9.316 -21.441 -0.958 1.00 0.00 PROT
ATOM 4 HT3 LEU 1 -10.007 -21.389 0.478 1.00 0.00 PROT
ATOM 5 CA LEU 1 -10.642 -19.924 -0.729 1.00 0.00 PROT
ATOM 6 HA LEU 1 -10.092 -19.286 -0.214 1.00 1.00 PROT
ATOM 7 CB LEU 1 -10.604 -19.551 -2.214 1.00 1.00 PROT
ATOM 8 HB1 LEU 1 -11.432 -19.802 -2.731 1.00 1.00 PROT
ATOM 9 HB2 LEU 1 -9.764 -19.989 -2.566 1.00 1.00 PROT
ATOM 10 CG LEU 1 -10.447 -17.969 -2.340 1.00 1.00 PROT
Файл 2:
ATOM 1 N LEU 1 -10.186 -21.276 -0.497 1.00 2.00 PROT
ATOM 2 HT1 LEU 1 -10.773 -22.005 -0.843 1.00 4.00 PROT
ATOM 3 HT2 LEU 1 -9.316 -21.441 -0.958 5.00 4.00 PROT
ATOM 4 HT3 LEU 1 -10.007 -21.389 0.478 1.00 4.00 PROT
ATOM 5 CA LEU 1 -10.642 -19.924 -0.729 1.00 3.00 PROT
ATOM 6 HA LEU 1 -10.092 -19.286 -0.214 1.00 4.00 PROT
ATOM 7 CB LEU 1 -10.604 -19.551 -2.214 1.00 3.00 PROT
ATOM 8 HB1 LEU 1 -11.432 -19.802 -2.731 1.00 4.00 PROT
ATOM 9 HB2 LEU 1 -9.764 -19.989 -2.566 1.00 4.00 PROT
ATOM 10 CG LEUUUU 1 -10.447 -17.969 -2.340 1.00 3.00 PROT
Желаемый выходной файл будет:
ATOM 1 N LEU 1 -10.186 -21.276 -0.497 1.00 0.00 PROT
ATOM 2 HT1 LEU 1 -10.773 -22.005 -0.843 1.00 0.00 PROT
ATOM 3 HT2 LEU 1 -9.316 -21.441 -0.958 5.00 0.00 PROT
ATOM 4 HT3 LEU 1 -10.007 -21.389 0.478 1.00 0.00 PROT
ATOM 5 CA LEU 1 -10.642 -19.924 -0.729 1.00 0.00 PROT
ATOM 6 HA LEU 1 -10.092 -19.286 -0.214 1.00 1.00 PROT
ATOM 7 CB LEU 1 -10.604 -19.551 -2.214 1.00 1.00 PROT
ATOM 8 HB1 LEU 1 -11.432 -19.802 -2.731 1.00 1.00 PROT
ATOM 9 HB2 LEU 1 -9.764 -19.989 -2.566 1.00 1.00 PROT
ATOM 10 CG LEUUUU 1 -10.447 -17.969 -2.340 1.00 1.00 PROT
Я хочу заменить содержимое 10-го столбца файла 2 содержимым 10-го столбца в файле 1
Моя первая попытка была :
awk -v OFS="\t" 'FNR==NR{a[NR]=$10;next}{$10=a[FNR]}1' file1 file2
Но файл с вкладками, который я получил, программа, которую я использую для его чтения, не читает его в форме с вкладками.
Затем я попробовал:
awk 'FNR==NR{a[NR]=$10;next}{$10=a[FNR]}1' file1 file2
И программа его тоже не читает.
Итак ... Мне нужно сохранить исходный интервал.
Есть предложения?
Это в значительной степени вдохновлено Ответ Эда Мортона в https://stackoverflow.com/questions/22203066/column-replacement-with-awk-with-reeding-the-format
Используя GNU awk (gawk), вы можете запустить: gawk -f my.awk file2.txt file1.txt, где my.awk:
NR==FNR { pdb[NR]=$0; next }
{
split(pdb[FNR],flds,FS,seps)
flds[10]=$10
for (i=1;i in flds;i++)
printf "%s%s", flds[i], seps[i]
print ""
}
Решение:
awk -v FIELDWIDTHS = "61 1: 4 1:10" 'FNR == NR {a [NR] = $ 2; далее} {$ 2 = a [ FNR]} 1 'file1 file2
Процесс к решению:
Поскольку awk удаляет все символы, кроме одного пробела, я подумал о том, как включить эти пробелы и определить фиксированную ширину для столбцов с именем fields
в awk.
А вот и опция FIELDWIDTHS
, как описано в руководстве Руководство пользователя GNU Awk :
Указано разбиение входной записи на поля фиксированной ширины. присваивая строку, содержащую разделенные пробелами числа встроенная переменная FIELDWIDTHS. Каждое число определяет ширину поле, включая столбцы между полями.
Итак, сначала я придумал: awk -v FIELDWIDTHS = "9 3 4 8 6 8 9 8 6 10 4" 'FNR == NR {a [NR] = $ 10; следующий} {$ 10 = a [FNR]} 1 'file1 file2
, но вывод добавляет пробел (символ NewField) перед всеми полями, начиная со второго. Поэтому я попытался пропустить один символ, добавив : 1
перед всеми, кроме первых определений полей, но это не дало желаемого эффекта - на самом деле это ухудшило ситуацию.
Но так как есть только одно указанное поле, которое требует редактирования, я подумал, почему бы не разделить файл только на три поля, поэтому я придумал:
awk -v FIELDWIDTHS = "62 4 10" 'FNR == NR {a [NR] = $ 2; далее} {$ 2 = a [FNR]} 1' file1 file2
, но опять же есть дополнительные места персонажи. Поэтому я вычел 1 из длины первого поля и использовал 1:
, чтобы пропустить один символ для следующих полей.
Это кажется awk ward, но дает желаемый результат;)
PS: во время тестирования я использовал meld
(графическое приложение diff), чтобы сравнить вывод, который я записал в file3, добавив > file3
в конец команды - с файл2.