🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

sed

sedとは、POSIX環境のために作られたコマンドラインエディタです。sedは編集スクリプトの指示のもとに複数のファイルを編集し、標準出力にその結果を出力します。

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

Q&A

解決済

1回答

2654閲覧

while文内にいれるとsedコマンドの挙動が変わる(シェルスクリプト)

candycorn

総合スコア9

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

sed

sedとは、POSIX環境のために作られたコマンドラインエディタです。sedは編集スクリプトの指示のもとに複数のファイルを編集し、標準出力にその結果を出力します。

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

0グッド

0クリップ

投稿2021/01/07 09:52

###背景
以下のような入力ファイルがあるとします。

bash

1$ cat A_result.txt 21,AAAAA 32,BBBBB 4NA,CCCCC 5NAME,DDDDD 65,DDDDD

このデータをawkで加工し、sed '/^NA\t/d'のコマンドにより1列目がNAの行のみ削除、NAMEの行は残しました。NAMEの行が残っていることは、grepによって確認できました。

bash

1$ cat A_result.txt | awk -F"," -v OFS="" -v hoge="NUMBER" '{print $1,"\t",hoge}' | sort | uniq | sed '/^NA\t/d' | grep NA 2NAME NUMBER

そこで、while文を使ってlist.csvから得た値で入力ファイルを指定し、連続で上記の処理を行うスクリプトを作成しました。

bash

1#!/bin/bash 2declare -a COLS 3cat list.csv | while IFS=, read -a COLS; do 4 cat "${COLS[0]}"_result.txt | awk -F"," -v OFS="" -v hoge="${COLS[0]}" '{print $1,"\t",hoge}' | sort | uniq | sed '/^NA\t/d' >> result.txt 5 echo "${COLS[0]}" 6done

ところが、上記のスクリプトによって生成されたresult.txtを確認すると、1列目がNAの行もNAMEの行もどちらも削除されてしまいました。

bash

1$ grep NA result.txt 2(一致なし)

###質問
前置きが長くなってしまい申し訳ございませんが、while文内入れた時にsedコマンドの挙動が変わってしまって困っています。原因そして解決法をご教示願います。使用している環境は、MacOS Kernel Version: Darwin 20.2.0、bash5.0です。
よろしくお願いいたします。

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

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

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

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

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

Y.H.

2021/01/07 09:56

#!/bin/bash -x として実際にどんなコマンドが実行されてるか debugされては? 都度ここで質問するより早く解決するよ。
otn

2021/01/07 10:46

実行してみましたが、NAMEの行は残ってますね。 本当に質問文のコードと全く同じコードを実行していますか? 同じデータファイルを読んでますか?
candycorn

2021/01/07 11:01

お恥ずかしながら、デバックしてみたら解決しました。 保存先を変えたあと、気づかずに前のファイルをエディタで編集していました^^; 何度も本当にありがとうございます。
takasima20

2021/01/07 11:18

result.txt の内容は確認されましたか?
takasima20

2021/01/07 11:20

あら、解決しましたか。 ちなみに hoge は適当につけたものなので、意味のあるものに変えてあげてください。(汗
guest

回答1

0

自己解決

デバックで解決。
保存先を変えたあと、気づかずに前のファイルをエディタで編集してしまってた。

投稿2021/01/07 11:03

candycorn

総合スコア9

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

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

otn

2021/01/07 11:36

間違える可能性のあるところを全部疑うという心構えでないと、問題は解決できないですよ。 初心者にありがちなのは、「間違えてないのに、結果がおかしい」という人。 こういう人は心を入れ替えない限り、一生自分で解決できない。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問