アプリ版:「スタンプのみでお礼する」機能のリリースについて

教えてください。
awk,sed,シェルを使い、カンマ区切りのファイルの1カラム目と2カラム目をキーに、
あるファイルに含まれる行を削除するにはどうすればよいのでしょうか?

例)
--aaa.csv--
111,222,333,444
555,666,777,888
999,000,111,222

--file1.txt--
111222
555666

の場合、aaa.csvより下記行のみほしい。
999,000,111,222

ご存知でしたら、ご教授ください。
よろしくお願いします。

A 回答 (4件)

file1.txt


の内容は、
111,222
555,666
ではなく、
111222
555666
なのでしょうか。
単にaaa.csvの1カラムと2カラムを結合した文字列がfile1.txtに含まれている場合に、その行を削除すればいい、ということでよろしいでしょうか。
    • good
    • 0

こんな感じとか:


#!/bin/sh
AWKSCR=`sed -e 's/^\(...\)\(...\)$/\$1=="\1" \&\& \$2=="\2"{next;}/' f.txt; \
echo '{print;}'`
awk -F, "$AWKSCR" a.csv

Mac OS X 10.4.8で試してます。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
助かりました。
sed,awkの勉強にもなりました。

お礼日時:2006/11/19 11:20

とりあえず質問文の仕様どおり書いてみました。



とりあえずfile1.txtのフォーマットがご質問通りだと仮定して、作ってみました。

ファイル名:test1.awk
BEGIN {
i = 0
while ((getline str[i] < infile) > 0) ++i
}
{
f=0
for (l=0; l<i; ++l) {
if ($1$2 == str[l]) f=1
}
if (f == 0) print $0
}

ファイル名:test1.sh
#!/bin/sh
awk -F',' -v infile=$2 -f test1.awk $1

test1.awkをtest1.shと同じディレクトリに置き、test1.shにchmodで実行権をつけて、
./test1.sh aaa.csv file1.txt
と実行してみてください。
    • good
    • 0
この回答へのお礼

回答、ありがとうございました。
大変、助かりました。

お礼日時:2006/11/19 11:18

#!/usr/bin/awk -f


BEGIN {
FS = ","
scriptname = "sample"
if (ARGC < 3) {
printf "usage: %s file1 file2 [file3 ...]", scriptname > "/dev/stderr"
exit(1)
}
while ((getline v < ARGV[1]) > 0) {
chkitems[v] = 1
}
ARGV[1] = ""
}
{
if (($1 $2) in chkitems)
next

print
}

ひょっとしたらお使いのawkでは "/dev/stderr" でエラーになるかもしれません。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
助かりました。
sed,awkの勉強にもなりました。

お礼日時:2006/11/19 11:21

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!