Как игнорировать случаи, пробелы и пустые строки при сравнении текста между двумя файлами - PullRequest
0 голосов
/ 14 декабря 2018

Итак, я написал скрипт, в котором я сравниваю два файла

, чтобы мои файлы были file1:

This is line 1.
This is line 2.
This is line 3.
This is line 4.
This is line 5.

file 2:

this is line 1,aaa
this is line 2,bbb
this is line 3,ccc

мой код находит, находится ли предложение, предшествующее (в файле2) запятой, в файле, и, если оно существует, замените его предложением, которое следует за запятой.

Вот мой код

awk -F'"(,")?' '
NR==FNR { r[$2] = $3; next }
{ for (n in r) gsub(n, r[n]) } 1' file2.csv file1.csv>output.csv

поэтому мой файл output.csv должен выглядеть следующим образом:

aaa
bbb
ccc
This is line 4.
This is line 5.

Этот код работает нормально, если нет совпадений между падежами в обоих файлах и в пробелах.поэтому при сравнении я хочу сравнивать без учета регистра и путем обрезки пробелов.Например:

When comparing:
file1:
thisisline1.
thisisline2.
thisisline3. etc

, и выходные данные должны быть в исходном формате

This is line 1.

. Я ищу на лету обрезку и преобразование строчных букв

edit: Сделать этот вопрос более ясным относительно детали отделки салона.Я написал код:

cat file2.csv|tr -s ' '>file3.csv

, что это делает, обрезать несколько пробелов в один, так что

This is line 1.

такая же, как

This   is line 1.

Но проблемапроисходит, если существует пустая строка с одним или несколькими пробелами, например:

this is line 1,aaa
this is line 2,bbb
(blank line but with space)
this is line 3,ccc
this is line 4.
this is line 5. 

, поэтому, когда я сначала использую свою команду awk, а затем функцию обрезки, это не выполняется.так что даже с этим файлом мой вывод должен быть

aaa
bbb
ccc
This is line 4.
This is line 5.

Ответы [ 3 ]

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

Если вы рассматриваете Perl, вы можете использовать ниже

> cat anuj_f2 
this is line 1,aaa
this is line 2,bbb
this is line 3,ccc
> cat anuj_f1
This is line 1.
This is line 2.
This is line 3.
This is line 4.
This is line 5.
> perl -F"," -lane ' $kv{lc $F[0]."."}=$F[1] if $ARGV eq "anuj_f2"; if( $ARGV eq "anuj_f1" ) {s/$_/$kv{lc $_}?$kv{lc $_}:$_/ige;print } ' anuj_f2 anuj_f1
aaa
bbb
ccc
This is line 4.
This is line 5.
> 
0 голосов
/ 14 декабря 2018
$ cat tst.awk
{
    key = tolower($0)
    gsub(/[[:space:]]+/," ",key)
}
NR==FNR {
    val = $0
    sub(/,[^,]+$/,"",key)
    sub(/.*,/,"",val)
    key2val[key"."] = val
    next
}
{ print (key in key2val ? key2val[key] : $0) }

$ awk -f tst.awk file2 file1
aaa
bbb
ccc
This is line 4.
This is line 5.
0 голосов
/ 14 декабря 2018

проверьте это, пожалуйста, с помощью tolower

awk -F'"(,")?' '
NR==FNR { r[$2] = $3; next }
{ for (n in r) gsub(tolower(n), tolower(r[n])) } 1' file2.csv file1.csv>output.csv

Вы также можете использовать

IGNORECASE=1

Ссылка

...