質問: 質問する内容が非常に分かりづらくて申し訳ありません。テラタームでshellscriptにて、grepとwhile文を使って出力する処理を作っています。 1taro.txtとnames.txt >taro.txt 太郎1 taro_001 太郎2 taro_002 太郎3 taro_003 ...... 太郎30 taro_030 >names.txt taro_001 つよい かっこいい jiro_001 すごい かっこいい taro_002 すごい やさしい ... while文を使って、taro.txtの行数文だけ、taro.txtとname.txtと比較して同じtaro_xxxの列を出力したい。また、出力する際、taro.txtの一番頭にある「太郎」も出力したいのですが、どのような処理を記載すればよいでしょうか...? 理想結果 太郎1 taro_001 つよい かっこいい 太郎2 taro_002 すごい やさしい **※追記** やったこと while read line do //太郎xを一番左に出力する処理 cat taro.txt | awk '{print substr($0,1,3)}' cat names.txt | grep taro.txt done >taro.txt 上記の方法だと 出力結果のnames.txtが出力されず、taro.txtのawkで取得したものをtaro.txtの行数文繰り返す処理になってしまっております。 1行目のtaro.txtの結果を変数に入れ taroOnly=cat taro.txt | awk '{print substr($0,1,3)}' ehco -e ''${taroOnly}'/t' ehco names.txt | grep -e ${taroOnly} '.....taro...' taro.txtの5行目以降を条件として取得したいのですが、上手くいけず...。 2つの出力結果を1つに並べ、それをtaro.txtの行数文繰り返したいのですが、どのように変更すればよろしいでしょうか? 説明などが不足して大変申し訳ありませんでした。
回答: ソートして良いなら、NCC1701さんの回答の通り、`join`がまさにそのためのコマンドです。 事前に、マッチングする項目で各ファイルがソートされている必要があります。 ソートしたくない場合、`names.txt`のサイズがギガバイト単位で無い限りは、変数に覚えるのが簡単です。 ``` declare -A names while read a b do names[$a]="$b" done < names.txt while read a b do test "${names[$b]}" && echo "$a" "$b" "${names[$b]}" done < taro.txt ```