В GNU вы можете использовать - numeric-owner
, чтобы tar не сохранял ваше имя пользователя. В качестве альтернативы вы можете установить другой идентификатор пользователя с помощью - owner = ID
. При извлечении эти идентификаторы пользователей будут удалены, если экстрактор не является пользователем root.
Обычно для объединения файлов используется cpio
, который обычно используется с параметром - no-preserve-owner
. Так создаются файлы rpm
.
Но tar с идентификаторами пользователей редко является проблемой. Если вы хотите быть параноиком, вы используете специальную учетную запись для окончательного связывания.
Мне удалось решить свою проблему, просто присвоив конкретную строку и столбец в качестве переменной и объединив их с помощью echo - просто, когда знаешь ответ!
#!/bin/bash
cd FREQ/HF
rm Hessian.log
for i in *.out
do
grep -H -A16 "Force Constants (Second Derivatives of the Energy)" $i | tail -n +1 >> Hessian.tmp
x=`awk ' NR == 2 {printf " "" %10s %10s %10s %10s %10s \n", $2,$3,$4,$5,$6}' Hessian.tmp`
y=`awk ' NR == 12 {printf "%10s %10s %10s %10s \n", $2,$3,$4,$5}' Hessian.tmp`
a=`awk ' NR == 8 { printf "%5s %10s %10s %10s %10s %10s\n", $2,$3,$4,$5,$6,$7} ' Hessian.tmp`
b=`awk ' NR == 9 { printf "%5s %10s %10s %10s %10s %10s\n", $2,$3,$4,$5,$6,$7} ' Hessian.tmp`
c=`awk ' NR == 10 { printf "%5s %10s %10s %10s %10s %10s\n", $2,$3,$4,$5,$6,$7} ' Hessian.tmp`
d=`awk ' NR == 11 { printf "%5s %10s %10s %10s %10s %10s\n", $2, $3,$4,$5,$6,$7} ' Hessian.tmp`
e=`awk ' NR == 13 { printf "%10s", $3} ' Hessian.tmp`
f=`awk ' NR == 14 { printf "%10s %10s", $3, $4} ' Hessian.tmp`
g=`awk ' NR == 15 { printf "%10s %10s %10s", $3, $4,$5} ' Hessian.tmp`
h=`awk ' NR == 16 { printf "%10s %10s %10s %10s", $3, $4, $5,$6} ' Hessian.tmp`
echo "$x $y" >> Hessian.log
awk '
NR == 3, NR == 7 {printf "%5s %10s %10s %10s %10s %10s\n", $2,$3,$4,$5,$6,$7} ' Hessian.tmp >> Hessian.log
echo "$a $e" >> Hessian.log
echo "$b $f" >> Hessian.log
echo "$c $g" >> Hessian.log
echo "$d $h" >> Hessian.log
rm Hessian.tmp
echo "" >> Hessian.log
done
Простой сценарий Perl отлично справится с задачей (Perl уже установлен на dang почти везде):
#!/usr/bin/env perl
my @rows; # Preserve order of appearance
my %rows;
my $heading;
for (<>) {
chomp;
if (s/^\s+/ /) {
$heading .= $_;
} elsif (/^(\w+) (.*)$/) {
push @rows, $1 if not exists $rows{$1};
$rows{$1} .= $2;
} else {
die "Invalid line format at line $.";
}
}
my $fmt = "%-5s %s\n"; # Adjust width to suit taste
printf $fmt, '', $heading;
printf $fmt, $_, $rows{$_} for @rows;
Просто вызовите эту программу со своими данными примерно так:
$ my_column.pl < your_data.txt
(Предполагая, что вы сохранили приведенный выше сценарий как my_column.pl
и сделали его исполняемым с помощью chmod 755 my_column.pl
, конечно!)
Вышеупомянутое должно выполнить свою работу, но если вам нужно точное выравнивание столбцов или более сложное форматирование в целом, вы можете разделить
столбцы и установить определенную ширину столбцов с помощью printf
или одного из многих модулей табличного форматирования, доступных для Perl.