.csvファイルの2つの異なる列から2つの文字列を検索し、両方の文字列が同じ行にある場合にのみ出力を印刷する方法。
両方の文字列値は両方の変数に格納されます。
.csvファイルの2番目の列で最初の文字列を検索し、4番目の列で2番目の文字列を検索し、同じ行の両方の文字列に一致するものが見つかった場合にのみ出力を印刷します。
次のコマンドを使用して行内で一致する文字列を検索しますが、2つの異なる列の2つの文字列をどのように一致させますか?
awk -v pat="$list" -F":" '$0 ~ pat { print $1, $2, $3, $4 }' filename.csv
答え1
使用awk
:
awk -v pat1="$var1" -v pat2="$var2" -F, '($2==pat1&&$4==pat2)' infile.txt
答え2
あなたはあなたが与えられたGNU sed
タスクを実行することができます。
# bash function to properly escape the variable contents
# s.t. it can be used on the LHS of a sed s/// command
escVar() {
printf '%s\n' "$1" | sed -e 's:[][^\./$*]:\\&:g'
}
# now define your patterns to be used
pat1=$(escVar "$DC")
pat2=$(escVar "$CountryCpde")
# main...
sed -Ee '
h;s/[^,]+/\n&\n/2; s/[^,]+/\n&\n/4'"
/\n.*$pat1.*\n.*\n.*$pat2.*\n/"'!d;g
' filename.csv
または、Perl
次のコマンドを使用してこれを実行できます。
perl -F, -slane '
BEGIN{ @h{qw/1 3/} = (*pat1, *pat2); }
print if 2 == grep { 1 + index $F[$_], ${$h{$_}} } qw/1 3/;
' -- -pat1="$DC" -pat2="$CountryCode" -- filename.csv
布材
- フィールド区切り文字をコンマに設定し、自動ファイル読み取り(
-n
)を有効にして-s
コマンドラインで変数を宣言します。 - typeglobs *pat1, *pat2 値にハッシュを設定します。
- 次に、2 番目のフィールド $F[1] で pat1 を探し、4 番目のフィールド $F[3] で pat2 を探し、両方が同じレコードで見つかった場合にのみレコードが印刷されます。