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

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

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

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

Q&A

解決済

2回答

840閲覧

2つのテキストファイルの中身を画面出力する際、合体するように出力したい。

gren

総合スコア11

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

0グッド

0クリップ

投稿2019/08/05 10:11

編集2019/08/06 00:49

質問する内容が非常に分かりづらくて申し訳ありません。テラタームでshellscriptにて、grepとwhile文を使って出力する処理を作っています。

①taro.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の行数文繰り返したいのですが、どのように変更すればよろしいでしょうか?

説明などが不足して大変申し訳ありませんでした。

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

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

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

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

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

otn

2019/08/05 11:47

とりあえず、作ったところまでと、あと何ができていないのかを書いてください。
otn

2019/08/06 04:44

なんか、ぐちゃぐちゃですね。 names.txt に taro_001などは1回しか出てきませんか?
gren

2019/08/06 22:10

otnさん、申し訳ありません…改めて質問内容を少し整理します。 names.txtの中のtaro_001は基本重複をしないので、1回のみの出力になります。
guest

回答2

0

sh

1$cat taro.txt 2太郎1 taro_001 3太郎2 taro_002 4次郎1 jiro_001 5太郎3 taro_003 6$cat names.txt 7taro_001 つよい かっこいい 8jiro_001 すごい かっこいい 9taro_002 すごい やさしい 10 11$join -1 2 -2 1 -o 1.1,2.1,2.2,2.3 <(sort -k2 taro.txt) <(sort -k1 names.txt) 12次郎1 jiro_001 すごい かっこいい 13太郎1 taro_001 つよい かっこいい 14太郎2 taro_002 すごい やさしい

こういうことですか?

投稿2019/08/06 11:54

編集2019/08/07 02:56
NCC1701

総合スコア1680

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

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

gren

2019/08/07 09:05

ありがとうございます! joinを使って無事に解決出来ました…!
guest

0

ベストアンサー

ソートして良いなら、NCC1701さんの回答の通り、joinがまさにそのためのコマンドです。
事前に、マッチングする項目で各ファイルがソートされている必要があります。

ソートしたくない場合、names.txtのサイズがギガバイト単位で無い限りは、変数に覚えるのが簡単です。

Bash

1declare -A names 2 3while read a b 4do names[$a]="$b" 5done < names.txt 6 7while read a b 8do test "${names[$b]}" && echo "$a" "$b" "${names[$b]}" 9done < taro.txt

投稿2019/08/07 01:34

otn

総合スコア84559

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

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

gren

2019/08/07 09:03

ありがとうございます! 頂いたソースを試したところ、最後の一致点がうまく取れませんでしたが、1行目を declare join names で試したところ無事一致するものが取れました…! また、何度もコメント頂きありがとうございます…orz
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問