Сравнение 2 файлов в awk - PullRequest
0 голосов
/ 25 декабря 2018

У меня есть 2 входных файла, как показано ниже.

File1

India USA China Russia France England

File2

India
USA
China
Russia
France
England

Мне нужно проверить, все ли столбцы в файле 2 доступны в файле 1 в том же порядке.Какой эффективный способ добиться этого в сценариях awk (ksh)

Я написал пример сценария, как показано ниже.Но я хотел бы знать простое и эффективное решение.

#!/bin/ksh
        i=1
while read line
do
        val=`cat File1 | cut -d" " -f$i`
        echo $val $line

        if [ $val = $line ]
        then
                echo "Matches"
        else

                echo "Not matches"
        fi
        i=$((i+1))
done < ./File2

Ответы [ 4 ]

0 голосов
/ 30 декабря 2018

Использование Perl

$ cat vinoth1.txt
India USA China Russia France England

$ cat vinoth2.txt
India
USA
China
Russia
France
England

$ perl -lane ' BEGIN{@k=map{chomp($_);$_} qx(cat vinoth2.txt)} print "Line:$. matches" if join(" ",@k) eq join(" ",@F) ' vinoth1.txt
Line:1 matches
0 голосов
/ 25 декабря 2018

Следующая команда awk будет работать, даже если File1 имеет несколько строк.

awk 'FNR == NR { for (i=1;i<=NF;++i) a[++n] = $i; next }
     { print "Line " FNR ": " ($0 == a[FNR] ? "matches" : "does not match.") "." }' file1 file2

Вывод:

Line 1: matches.
Line 2: matches.
Line 3: matches.
Line 4: matches.
Line 5: matches.
Line 6: matches.
0 голосов
/ 25 декабря 2018
$ paste <(tr ' ' '\n' < file1) file2 | awk '{print $0, ($1 == $2 ? "" : "no ") "match"}'
#India   India match
#USA     USA match
#China   China match
#Russia  Russia match
#France  France match
#England England match
0 голосов
/ 25 декабря 2018

Не могли бы вы попробовать один раз?Протестировано только с предоставленными образцами.

awk '
{
  sub(/[[:space:]]+$/,"")
}
FNR==NR{
  a[FNR]=$0
  next
}
{
  for(i=1;i<=NF;i++){
    count=a[i]==$i?++count:count
  }
  if(count==length(a)){
    print "Line number " FNR " whose contents are:" $0 " present in both the files."
  }
  count=""
}'   Input_file2   Input_file1

Вывод будет следующим:

Line number 1 whose contents are:India USA China Russia France England present in both the files.

В случае, если ваши строки могут содержать заглавные или строчные буквы, смешайте их значения, добавляя решение, которое могло быпозаботьтесь об этой проблеме.

awk '
{
  sub(/[[:space:]]+$/,"")
}
FNR==NR{
  a[FNR]=tolower($0)
  next
}
{
  for(i=1;i<=NF;i++){
    count=a[i]==tolower($i)?++count:count
  }
  if(count==length(a)){
    print "Line number " FNR " whose contents are:" $0 " present in both the files."
  }
  count=""
}'  Input_file2   Input_file1

Или как описано в коде чата с условием else.

awk '
{
  sub(/[[:space:]]+$/,"")
}
FNR==NR{
  a[FNR]=tolower($0)
  next
}
{
  for(i=1;i<=NF;i++){
    count=a[i]==tolower($i)?++count:count
  }
  if(count==length(a)){
    print "Line number " FNR " whose contents are:" $0 " present in both the files."
  }
  else{
    print "Line number " FNR " is NOT matching..."
  }
  count=""
}'  Input_file2   Input_file1
...