sedを使用して列1と7のパターンに基づいてcsvファイルの結果をフィルタリングするにはどうすればよいですか?

sedを使用して列1と7のパターンに基づいてcsvファイルの結果をフィルタリングするにはどうすればよいですか?

カスタム値に対して列1と7を検索するシェルスクリプトを作成しようとしています。ここで、$3 は列 7 の年と一致し、$2 は列 1 の年と一致します ($1 はファイル名)。 7番目の列はうまく一致させることができますが、最初の列に一致させる変数を追加しようとすると、 'sed:-e式#1、char 7:unknown command: `2'エラーが発生し続けます。残念ながら、awkの代わりにsedを使用する必要があります。これが私が今まで持っているものです:

sed -n "/"$2",[^,],[^,],[^,],[^,],[^,]*,"$3"/p" "$1"

この問題をどのように解決するのですか?私は初心者なので、すべての助けを歓迎します。 Shellcheckを試しましたが役に立ちませんでした。列7をスキャンするとスクリプトは正常に機能しますが、$ 2の側面を追加するとエラーが発生します。

編集:例呼び出し:

./script.sh filename "2015.2016" "South"

サンプルファイル(「...」は内部にテキストがある列です):

2021/2022,text,text,text,text,text,South,text,...,...
2021/2022,text,text,text,text,text,North,text,...,...
2015/2016,text,text,text,text,text,South,text,...,...
2014/2015,text,text,text,text,text,West,text,...,...

予想出力:

2015/2016,text,text,text,text,text,South,text,...,...

編集:これが実際に仕事に最適なツールではないことに同意しますが、しばらく遊んで、sedを使ってこれを行う方法を見つけました。

#!/bin/bash

year="$2"
name="$3"

sed -n '/^'"$year"',\([^,]*,\)\{5\}'"$name"'\(,.*\)\{0,\}$/p' "$1" 

私が使うかどうかはわかりませんが、他の人には役に立つと思います。正確な結果を生成するには、入力に「/」の代わりに「.」が必要です。

ベストアンサー1

sedはあまり良いツールではありません。ただawkを使用してください。

$ cat script.sh
#!/usr/bin/env bash

awk -F',' '$1==a && $7==b' a="$2" b="$3" "$1"

$ ./script.sh file.csv "2021" "South"
2021,text,text,text,text,text,South,text

ただし、sedソリューションが必要なので、POSIX sedを使用してください。

$ cat script.sh
#!/usr/bin/env bash

a=$(sed 's/[^^\\]/[&]/g; s/\^/\\^/g; s/\\/\\\\/g' <<< "$2")
b=$(sed 's/[^^\\]/[&]/g; s/\^/\\^/g; s/\\/\\\\/g' <<< "$3")
sed -n '/^'"$a"',\([^,]*,\)\{5\}'"$b"'\(,.*\)\{0,\}$/p' "$1"

$ ./script.sh file.csv "2021" "South"
2021,text,text,text,text,text,South,text

バラよりsedを使用して正規表現のメタ文字を確実にエスケープすることは可能ですか?最初の2つのsedコマンドが必要な理由は、単にリテラル文字列一致を実行する必要があり、sedはリテラル文字列一致ではなく正規表現一致のみをサポートしているため、可能なすべての正規表現メタ文字をエスケープする必要があるためです(実際にはすべての文字をエスケープする必要があります)。 char は sed スクリプトの区切り文字 (たとえば/) であり、リテラル文字のように動作するようにします。入力をフィールドに分割しないことです)。

おすすめ記事