Сценарий оболочки - объедините два файла, используя AWK для определенного столбца - PullRequest
0 голосов
/ 21 декабря 2018

У меня первый файл test1.csv, разделенный трубами и одной вкладкой всегда:

ug|s|B|city|bg1|1|8D|ON-05|100  10|28|288
ug|s|B|city|bg1|1|D9|ON-05|150  11|28|288
ug|s|B|city|bg2|2|94|ON-05|350  12|28|288

У меня второй файл test2.csv только с одной вкладкой:

bg1 250
bg2 350

Я хочучтобы объединить их, используя номер столбца 5 из первого файла (bg1, bg2), чтобы я мог взять значения из второго файла (250,350)

Таким образом, конечный результат должен быть:

ug|s|B|city|bg1|1|8D|ON-05|100|250  10|28|288
ug|s|B|city|bg1|1|D9|ON-05|150|250  11|28|288
ug|s|B|city|bg2|2|94|ON-05|350|350  12|28|288

Я пытался использовать AWK, чтобы присоединиться к ним:

awk -F '|' -v OFS='|' '
    FNR==NR {  } {
        split($NF, b, "\t")
        $NF = b[1] FS a[b[1]] "\t" b[2]
    } 1' test2.csv test1.csv > final.csv

, но не получил правильных результатов

Ответы [ 3 ]

0 голосов
/ 21 декабря 2018
awk '
    BEGIN { FS=OFS="\t"; subFs="|" }
    NR==FNR { map[$1]=$2; next }
    { split($1,subFlds,subFs); print $1 subFs map[subFlds[5]], $2 }
' test2.csv test1.csv
ug|s|B|city|bg1|1|8D|ON-05|100|250      10|28|288
ug|s|B|city|bg1|1|D9|ON-05|150|250      11|28|288
ug|s|B|city|bg2|2|94|ON-05|350|350      12|28|288
0 голосов
/ 22 декабря 2018

Вы можете сделать это и с Perl.

$ cat test2.csv
bg1     250
bg2     350

$ cat test1.csv
ug|s|B|city|bg1|1|8D|ON-05|100  10|28|288
ug|s|B|city|bg1|1|D9|ON-05|150  11|28|288
ug|s|B|city|bg2|2|94|ON-05|350  12|28|288

$ perl -F'\t' -lane 'if($ARGV eq "test2.csv") { $kv{$F[0]}=$F[1]}; if( $ARGV eq "test1.csv" ) { ($x,$y)=(split(/\|/,$F[0]))[4,8]; if($kv{$x}) {$F[0]=~s/$y$/$kv{$x}/g } pr
int "$F[0]\t$F[1]" } ' test2.csv  test1.csv
ug|s|B|city|bg1|1|8D|ON-05|250  10|28|288
ug|s|B|city|bg1|1|D9|ON-05|250  11|28|288
ug|s|B|city|bg2|2|94|ON-05|350  12|28|288

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

Это идеальный вариант использования для моего общего утверждения, что следует избегать -v в пользу прямого назначения в командной строке.Вы можете легко переключать FS между файлами и делать:

$ awk 'NR==FNR{f[$1]=$2; next} {print $0, f[$5]}' test2.csv FS=\| OFS=\| test1.csv
ug|s|B|city|bg1|1|8D|ON-05|100  10|28|288|250
ug|s|B|city|bg1|1|D9|ON-05|150  11|28|288|250
ug|s|B|city|bg2|2|94|ON-05|350  12|28|288|350

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

awk 'NR==FNR{f[$1]=$2; next} {split($9,a,"\t"); \
    $9=a[1] "|" f[$5] "\t" a[2]}1' test2.csv FS=\| OFS=\| test1.csv
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...