Список и переименование файлов, которые начинаются с тире / дефиса (-)

У меня есть Более 100 файлов, начинающихся с тире ( - ). Мне нужно знать, как сделать две вещи:

Пример: -20200622_142237.jpg (Расширения файлов различаются, но все есть тире в начале.)

  1. Как мне перечислить ( ls ) файлы, которые начинаются с этого тире? Кажется, Bash думает, что я пытаюсь использовать другой параметр. Я пробовал использовать одиночный кавычки, двойные кавычки и - впереди. Кажется, ничего не работает.

  2. Как мне переименовать все эти файлы одновременно? Намерение состоит в том, чтобы переименовать их без тире в начале.

ПРИМЕЧАНИЕ: Я не хочу менять подчеркивание ( _ ). Я просто хочу удалить тире ( - ) в начале файла.

Наконец, я ' Мы уже пробовали это возможное решение , опубликованное ранее, но оно не работает.

-121 --- 857 351- Сохранять исходный интервал при замене [AWK, SED, GREP,…] У меня есть два файла, содержимое которых: Файл 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 ...

У меня есть два файла, содержимое которых:

Файл 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

И программа его тоже не читает.

Итак ... Мне нужно сохранить исходный интервал.

Есть предложения?

0
задан 25 June 2020 в 02:59

2 ответа

Это в значительной степени вдохновлено Ответ Эда Мортона в 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 ""
}
1
ответ дан 30 July 2020 в 22:20

Решение:

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.

1
ответ дан 30 July 2020 в 22:20

Другие вопросы по тегам:

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