добавляя содержимое нескольких файлов с помощью awk, sed или grep

Не рекомендуется использовать такие команды, как cp или rsync. Для больших файлов это займет много времени. mv намного быстрее, поскольку он обновляет только inodes без физического копирования файлов. Лучше использовать файловый менеджер вашей операционной системы. Для Opensuse есть файловый менеджер Konquerer. Он может перемещать файлы, не копируя их. Он имеет функцию «вырезать и вставить», как и в Windows. Просто выберите все подкаталоги в каталоге A. Щелкните правой кнопкой мыши и «перейдите в» каталог B, который может содержать подкаталоги с такими же именами. Он их объединит. Есть также варианты, хотите ли вы перезаписать или переименовать файлы с одинаковыми именами.

0
24.04.2019, 13:52
2 ответа

Пробовал с помощью команд, указанных ниже, тоже работает нормально

Step1

awk 'NR==FNR{a[$5];next}($1 in a){print $0}' file1 file2 > u.txt
count=`awk '{print NR}' u.txt | sort -nr| sed -n '1p'`

step2

for ((i=1;i<=$count;i++)); do h=`awk -v i="$i" 'NR==i{print $1}' u.txt`; j=`awk -v i="$i" 'NR==i{print $2}' u.txt `; awk -v h="$h" -v j="$j" '$5 == h {$6=j;print $0}' file1; done >file3.txt


step3

awk 'NR==FNR{a[$1];next}!($5 in a){print $0}' file2 file1 >file4.txt


Step4(Final output)

awk '{print $0}' file3.txt file4.txt
-. ID = tom_fa_10005086 ABI3VP1
- 0 Parent = tom_fa_10005086 ABI3VP1
- 0 Parent = tom_fa_10005086 ABI3VP1
- 2 Parent = tom_fa_10005086 ABI3VP1
- 1 Parent = tom_fa_10005086 ABI3VP1
- 0 Parent = tom_fa_10005086 ABI3VP1
- 0 Parent = tom_fa_10005086 ABI3VP1
+. ID = tom_fa_10013928 ABI3VP2
+ 0 Parent = tom_fa_10013928 ABI3VP2
+ 0 Parent = tom_fa_10013928 ABI3VP2
+ 0 Parent = tom_fa_10013928 ABI3VP2
+ 0 Parent = tom_fa_10013928 ABI3VP2
+ 2 Parent = tom_fa_10013928 ABI3VP2
+ 2 Parent = tom_fa_10013928 ABI3VP2
+ 1 Parent = tom_fa_10013928 ABI3VP2
+ 1 Parent = tom_fa_10013928 ABI3VP2
+ 2 Parent = tom_fa_10013928 ABI3VP2
+ 2 Parent = tom_fa_10013928 ABI3VP2
-. ID = tom_fa_10000024 Alfin-like
- 0 Parent = tom_fa_10000024 Alfin-like
-  .   ID  =   tom_fa_10004587
-   0   Parent  =   tom_fa_10004587
-   1   Parent  =   tom_fa_10004587
-   1   Parent  =   tom_fa_10004587
+  .   ID  =   tom_fa_10018753
+   0   Parent  =   tom_fa_10018753
+   2   Parent  =   tom_fa_10018753
+   2   Parent  =   tom_fa_10018753
+   0   Parent  =   tom_fa_10018753
+  .   ID  =   tom_fa_10007441
+   0   Parent  =   tom_fa_10007441
+   0   Parent  =   tom_fa_10007441
+   1   Parent  =   tom_fa_10007441
+   0   Parent  =   tom_fa_10007441
+   1   Parent  =   tom_fa_10007441
+   2   Parent  =   tom_fa_10007441
-1
28.01.2020, 05:05

Если вы хотите сделать это за один проход, этот sedскрипт будет работать:

sed '/^[^ ]* [^ ]*$/{H;d;};G;s/ \([^ ]*\)\n.*\n\1 \([[:print:]]*\).*/ \1   \2/;P;d' file2 file1

Что он делает? Он собирает все строки file2в пространстве хранения в качестве своего рода таблицы поиска, затем добавляет эту таблицу к каждой строке пространства шаблонов и добавляет шестой столбец, если шаблон найден. Подробно:

  • /^[^ ]* [^ ]*$/соответствует строкам с двумя столбцами, только для тех, выполняется следующая команда (команды внутри {}
  • {H;d;}добавляет строки в область хранения и останавливает дальнейшую обработку строки, поэтому остальная часть скрипта выполняется только для строкfile1
  • Gдобавляет пространство хранения с нашей таблицей поиска к пространству шаблонов
  • s/ \([^ ]*\)\n.*\n\1 \([[:print:]]*\).*/ \1 \2/добавляет шестой столбец для соответствия
  • Pпечатает строку без присоединенной таблицы
  • dподавляет другой вывод (опция -nсделала бы то же самое)
0
28.01.2020, 05:05

Теги

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