Shell에서 다양한 텍스트 파일의 데이터를 비교하고 인쇄하는 방법.
나는 다음을 사용하여 NAS
세 가지 다른 상자의 세부 사항을 캡처 했습니다.SSH
마운트 이름동일한 경우 첫 번째 열에 있어야 합니다.산세 개의 상자에 존재하는 경우 동일한 줄에 인쇄되어야 합니다.산에만 나타납니다BOX_B그리고BOX_C그 다음에마운트 이름첫 번째 열에 나타나야 하며박스_A비워두어야 합니다
두 가지 예를 들어보자df_BoxA.txt그리고df_BoxB.txt그리고df_BoxC.txt
예:
$cat df_BoxA.txt
/logs/boxA 2G 1.2G 7.7G 62% NAS:/logs/boxA
/data/boxA 2G 1.8G 2.0G 91% NAS:/data/boxA
/apps/boxA 2G 1.4G 5.7G 72% NAS:/apps/boxA
/data/java 1G 67M 9.3G 7% NAS:/data/java
/home/admin 10G 4.6G 54G 46% NAS:/home/admin
/admin/arch 10G 8.3G 19G 83% NAS:/admin/arch
/apps/dist 10G 8.3G 19G 83% NAS:/apps/dist
$cat df_BoxB.txt
/logs/boxA 2G 1.2G 7.7G 62% NAS:/logs/boxB
/data/boxA 2G 1.8G 2.0G 91% NAS:/data/boxB
/apps/boxA 2G 1.4G 5.7G 72% NAS:/apps/boxB
/home/user 40G 29.3G 107G 74% NAS:/home/user1
/data/java 1G 67M 9.3G 7% NAS:/data/java
/home/admin 10G 4.6G 54G 46% NAS:/home/admin
/apps/dist 10G 8.3G 19G 83% NAS:/apps/dist
$cat df_BoxC.txt
/logs/boxA 2G 1.2G 7.7G 62% NAS:/logs/boxC
/data/boxA 2G 1.8G 2.0G 91% NAS:/data/boxC
/apps/boxA 2G 1.4G 5.7G 72% NAS:/apps/boxC
/home/user1 40G 29.3G 107G 74% NAS:/home/user1
/home/admin 10G 4.6G 54G 46% NAS:/home/admin
/admin/arch 10G 8.3G 19G 83% NAS:/admin/arch
/apps/dist 10G 8.3G 19G 83% NAS:/apps/dist
세 파일을 모두 병합한 후 결과는 다음과 같습니다.
$cat result.txt
/logs/boxA 2G 1.2G 7.7G 62% NAS:/logs/boxA 2G 1.2G 7.7G 62% NAS:/logs/boxB 2G 1.2G 7.7G 62% NAS:/logs/boxC
/data/boxA 2G 1.8G 2.0G 91% NAS:/data/boxA 2G 1.8G 2.0G 91% NAS:/data/boxB 2G 1.8G 2.0G 91% NAS:/data/boxC
/apps/boxA 2G 1.4G 5.7G 72% NAS:/apps/boxA 2G 1.4G 5.7G 72% NAS:/apps/boxB 2G 1.4G 5.7G 72% NAS:/apps/boxC
/data/java 1G 67M 9.3G 7% NAS:/data/java 1G 67M 9.3G 7% NAS:/data/java
/home/admin 10G 4.6G 54G 46% NAS:/home/admin10G 4.6G 54G 46% NAS:/home/admin 10G 4.6G 54G 46% NAS:/home/admin
/admin/arch 10G 8.3G 19G 83% NAS:/admin/arch 10G 8.3G 19G 83% NAS:/admin/arch
/apps/dist 10G 8.3G 19G 83% NAS:/apps/dist 10G 8.3G 19G 83% NAS:/apps/dist 10G 8.3G 19G 83% NAS:/apps/dist
/home/user 40G 29.3G 107G 74% NAS:/home/user1
/home/user1 40G 29.3G 107G 74% NAS:/home/user1
명령을 사용하여 파일을 결합해 보았지만 pr
원하는 결과가 아닙니다.
또한 사용해 보았 sdiff
으나 결과를 얻지 못했습니다.
이 문제를 어떻게 해결할 수 있나요?
답변1
수행하려는 작업에는 약간의 프로그래밍이 필요합니다.
#!/usr/bin/perl
# Program to join files of TAB separated data based on first key
# --J. Ziobro--: 11/2014
use strict;
my $f;
my %allLines;
my $maxColumns = 0;
my $fileNum = 0;
my %keys;
foreach $f (@ARGV) {
die "Could not open $f" unless open( F, $f );
while (<F>) {
chop;
my ( $key, @line ) = split /\t/; # assume tab separate all cols
$maxColumns = ( $maxColumns > @line ) ? $maxColumns : @line;
# allLines is indexed by KEY <tab> FileNumber
$keys{$key} = 1;
$allLines{ $key . "\t" . $fileNum } = join( "\t", @line );
}
$fileNum++;
}
foreach ( keys %keys ) {
print $_;
for ( $f = 0 ; $f < $fileNum ; $f++ ) {
if ( exists $allLines{ $_ . "\t" . $f } ) {
print "\t", $allLines{ $_ . "\t" . $f };
}
else {
print " " x $maxColumns;
}
}
print "\n";
}
안녕히 계세요, //Z\
답변2
그래요매우 확신하다당신이 찾고있는 join
. 안타깝게도 저는 이 일을 잘 못합니다. 원하는 방식으로 필드를 채우는 방법이 있다는 것을 알고 있지만 지금까지는 줄 시작 부분에만 짝이 없는 줄만 인쇄할 수 있습니다. join
한 번에 두 개의 파일만 연결되므로 짝이 없는 줄은 원하는 곳에 표시되지 않습니다. 적어도 나에게는 그렇습니다.생각하다그들은하지 않습니다. 귀하의 질문이 약간 불분명합니다. 죄송합니다.
어쨌든 , 사용하려면 join
먼저sort
필드 조인- 기본적으로 이것이 첫 번째 것이며 여기서는 다음을 사용합니다.
for f in file[123]
do sort <<IN >"$f"
$(cat "$f")
IN
done
다음으로 앞서 말했듯이 join
한 번에 두 개의 파일만 연결할 수 있으므로 join
처음 두 파일을 편집하고 해당 출력을 다른 파일로 파이프하여 join
세 번째 파일을 얻었습니다.
join -a1 -a2 file[12] |
join -a1 -a2 - file3 |
column -t | sort -hk2,2
나는 또한 그것을 column
다시 sort
포맷하기 위해 파이프를 연결했습니다. 결과는 다음과 같습니다.
/data/java 1G 67M 9.3G 7% NAS:/data/java 1G 67M 9.3G 7% NAS:/data/java
/apps/boxA 2G 1.4G 5.7G 72% NAS:/apps/boxA 2G 1.4G 5.7G 72% NAS:/apps/boxB 2G 1.4G 5.7G 72% NAS:/apps/boxC
/data/boxA 2G 1.8G 2.0G 91% NAS:/data/boxA 2G 1.8G 2.0G 91% NAS:/data/boxB 2G 1.8G 2.0G 91% NAS:/data/boxC
/logs/boxA 2G 1.2G 7.7G 62% NAS:/logs/boxA 2G 1.2G 7.7G 62% NAS:/logs/boxB 2G 1.2G 7.7G 62% NAS:/logs/boxC
/admin/arch 10G 8.3G 19G 83% NAS:/admin/arch 10G 8.3G 19G 83% NAS:/admin/arch
/apps/dist 10G 8.3G 19G 83% NAS:/apps/dist 10G 8.3G 19G 83% NAS:/apps/dist 10G 8.3G 19G 83% NAS:/apps/dist
/home/admin 10G 4.6G 54G 46% NAS:/home/admin 10G 4.6G 54G 46% NAS:/home/admin 10G 4.6G 54G 46% NAS:/home/admin
/home/user1 40G 29.3G 107G 74% NAS:/home/user1
/home/user 40G 29.3G 107G 74% NAS:/home/user1