質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

コマンド

コマンドとは特定のタスクを行う為に、コンピュータープログラムへ提示する指示文です。多くの場合、コマンドはShellやcmdようなコマンドラインインターフェイスに対する指示文を指します。

Q&A

解決済

1回答

4953閲覧

【ターミナル】awkで構文エラー(syntax error at source line 1)

testyoutatsu

総合スコア29

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

コマンド

コマンドとは特定のタスクを行う為に、コンピュータープログラムへ提示する指示文です。多くの場合、コマンドはShellやcmdようなコマンドラインインターフェイスに対する指示文を指します。

0グッド

0クリップ

投稿2019/04/30 13:08

編集2019/04/30 14:08

複数のcsvファイルの5〜11列目を削除したく以下のコマンドを実行しましたが、構文エラーで空ファイルになってしまいます。

find . -name "*.csv" | xargs -I% sh -c "awk '{$5=$6=$7=$8=$9=$10=$11=""; FS=","; gsub(/^[ \t]+/, "", $0); print $0}' % > tmp; mv tmp %"

error

1awk: syntax error at source line 1 2 context is 3 >>> {== <<< 4awk: illegal statement at source line 1 5awk: illegal statement at source line 1

どの箇所が間違っているのでしょうか?
サブディレクトリまでを対象します。
ご教授のほどよろしくお願いします。

macOS Mojave (バージョン 10.14.4)

###csvファイル

LON,LAT,NUMBER,STREET,UNIT,CITY,DISTRICT,REGION,POSTCODE,ID,HASH 136.949253,35.178498,2-7,若水三丁目,,,,,,,06d7cd2585a61548 136.987289,35.16231,23-7,星ケ丘一丁目,,,,,,,4f9b92fc1a3b0de1 136.987289,35.16231,1-7,星ケ丘一丁目,,,,,,,bf2bf191837348e7 136.98835,35.16246,5-7,星ケ丘一丁目,,,,,,,32acb59a0dbdfef3

このような座標データです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

"の中に"を書くときは\"と書いてください。

投稿2019/04/30 13:48

otn

総合スコア84499

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

testyoutatsu

2019/04/30 14:06 編集

回答ありがとうございます。 find . -name "*.csv" | xargs -I% sh -c "awk '{$5=$6=$7=$8=$9=$10=$11=\"\"; FS=\",\"; gsub(/^[ \t]+/, \"\", $0); print $0}' % > tmp; mv tmp %" このような記述で正しいでしょうか? 最初と同じエラーが出て空ファイルになってしまいます。
otn

2019/04/30 14:16

失礼しました。$ も $ ですね。
testyoutatsu

2019/04/30 14:20 編集

初歩的ですが長く躓いていたことが解決しました。 ありがとうございました!
otn

2019/04/30 14:31 編集

あと、CSVを読むなら、読んだ後にFS=","しても、1行目には間に合いません。 また、OFSもカンマにしないと、出力が空白区切りになりますよ。 awk 'BEGIN(FS=OFS=\",\"}{~ か awk -F, 'BEGIN{OFS=FS}{~ このレベルの間違いがあると言うことは、find + xargs を使う前に、1ファイルに対してのawkが正しく動くことを確認してないのでしょうか?
testyoutatsu

2019/04/30 14:46 編集

丁寧にありがとうございます。1行目が処理されない理由がわかりました。 追記 見よう見まねでやっており知識不足で申し訳ありません。1ファイルに対して動作を確認していませんでした。 カンマ区切りについてもありがとうございます。早速試してみます。
otn

2019/04/30 14:38

awkを使わずに、 sh -c 'cut -d, -f1-4 % | sed "s/[ \t]//g" > tmp ; mv tmp %' がわかりやすい気がします。
testyoutatsu

2019/04/30 15:03

ありがとうございます。こちらも試してみたいと思います。 awkの方ですがコマンド実行後、元々あったカンマが空白に置きかわり、削除した列が空白とカンマになりました。 LON LAT , STREET , , , , , , , 136.949253 35.178498 , 若水三丁目 , , , , , , , 136.987289 35.16231 , 星ケ丘一丁目 , , , , , , , 以下のように空白のない状態にしたいのですが、方法を教えていただけると幸いです。 LON,LAT,STREET , , , , , , , 136.949253,35.178498,若水三丁目 136.987289,35.16231,星ケ丘一丁目
otn

2019/04/30 15:59

awk部分はどう書いてますか?
testyoutatsu

2019/04/30 16:17

find . -name "*.csv" | xargs -I% sh -c "awk -F, '{$3=$5=$6=$7=$8=$9=$10=$11=\",\"; gsub(/^[ \t]+/, \"\", $0); print $0}' % > tmp; mv tmp %" 実行したコマンドはこちらです。
otn

2019/04/30 16:22

私が書いたようにOFSをセットしていない。 あと、質問とかなり変わってますね。削除する要素には空文字列を代入では?
testyoutatsu

2019/04/30 16:27

あ、すみません。OFSの組み込みをしていませんでした。 話が脱線したので、これ以降について分からないことがありましたら新しく質問させていただきます。 丁寧にありがとうございました。
testyoutatsu

2019/04/30 16:39

スマートではないかもしれませんが、以下のコマンドで期待する結果が得られました。 find . -name "*.csv" | xargs -I% sh -c "awk -F, 'BEGIN {OFS=FS} {$3=$5=$6=$7=$8=$9=$10=$11=\",\"; gsub(/^[ \t]+/, \"\", $0)}{print $1,$2,$4}' % > tmp; mv tmp %"
otn

2019/04/30 16:41

削除した部分もカンマを残したいなら、awk -F, 'BEGIN{OFS=FS}{$3=$5=~$11="";print}' 1,2,,4,,,,,,, 削除した部分はカンマも削除するなら、cut -d, -f1,2,4 1,2,4 ですね。cut の場合は、-f のあとに残したい列番号をカンマ区切りで書きます。
otn

2019/04/30 16:43

そうするのであれば、 $3=$5=$6=$7=$8=$9=$10=$11=\",\"; の部分は無意味ですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問