Как я могу прочитать и использовать значения текстового файла (через запятую или через строку) в команде awk - PullRequest
0 голосов
/ 11 июня 2018

У меня есть команда awk для фильтрации строк с использованием столбца 2.

awk 'BEGIN { FS = ","; OFS = FS;} {if ($2=="ABC" || $2=="DEF" || $2=="PQR" || $2=="XYZ") print}' $1  >> $1tmp

Можно ли получить логику, чтобы я мог читать значения (ABC, DEF, XYZ) с помощью текстового файла и передавать егов awk.

Inputfile.csv

1,ABC,100
2,XYZ,200
3,MNO,100
4,PQR,100
5,EFG,100
6,QWE,100
7,DEF,200

Выходные данные должны быть похожи на

1,ABC,100
2,XYZ,200
4,PQR,100
7,DEF,200

value.txt файл содержит

ABC
PQR
DEF
XYZ

ЕстьНесколько способов я пытался достичь этого

filename = value.txt
while IFS='' read -r line || [[ -n "$line" ]]; do
awk 'BEGIN { FS = ","; OFS = FS;} {if ($2=="$line") print}' Inputfile.csv
done < $filename

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

Другой подход

filename = value.txt
ind=0
while read line ; do
MYARRAY[$ind]=$line
index=$(($ind+1))
done < $filename
awk 'BEGIN { FS = ","; OFS = FS;} {if ($2== ${MYARRAY[@]})

но здесь проблема в том, что MyArray печатает значение в виде строки (ABC PQR XYZ ....), которая не соответствует условию if в awk

1 Ответ

0 голосов
/ 11 июня 2018

Если я прочитал это правильно, то предоставил файл variables.txt, содержащий

ABC
DEF
PQR
XYZ

И входной файл data.txt, содержащий

1|ABC
2|nope
3|asdkl
4|PQR
5|stuff
6|DEF
7|XYZ

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

awk -F '|' 'NR == FNR { vars[$1]; next } $2 in vars' variables.txt data.txt

для получения

1|ABC
4|PQR
6|DEF
7|XYZ

Это работает следующим образом:

NR == FNR {   # When processing the first file (overall record number equal to
              # record number within the file)
  vars[$1]    # remember that $1 was seen
  next        # and process the next record
}
$2 in vars    # when processing the second file: filter for lines where
              # $2 is one of those remembered tokens.
...