カスタム値に対して列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 スクリプトの区切り文字 (たとえば/
) であり、リテラル文字のように動作するようにします。入力をフィールドに分割しないことです)。