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

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

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

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

シェル

シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。

sh

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

AWK

AWKは、UNIX 上で開発されたプログラミング言語で、CSVファイルなどのテキストファイルの処理を目的にデザインされています。

Q&A

2回答

2712閲覧

シェルスクリプトでファイルを結合

hwhshsq

総合スコア19

bash

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

シェル

シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。

sh

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

AWK

AWKは、UNIX 上で開発されたプログラミング言語で、CSVファイルなどのテキストファイルの処理を目的にデザインされています。

0グッド

0クリップ

投稿2016/09/12 05:38

編集2016/09/12 05:52

Linux(シェル)初心者ですが、よろしくお願いします。
シェルを書く練習をしており、以下の場合のよい方法が思い浮かびません。

2種類のファイルA.txtとB.txtがあります

・A.txt(5行目行頭の"はteratailの仕様上記入しました。実際はありません)

Name Type Number Condition


machineA1 A_1 1 Yes
machineB1 B_1 1 Broken
" since 1 day ago
machineB2 B_2 1 Yes

・B.txt

A_1 C1
B_2 C2

以上の2つのファイルから、どのタイプの機械がどこに接続されているか、
ということを示した、以下のようなファイルを作成したいです。
(5行目行頭の"はteratailの仕様上記入しました。実際はありません)

Name Type Number Condition Connected to


machineA1 A_1 1 Yes C1
machineB1 B_1 1 Broken
" since 1 day ago
machineB2 B_2 1 Yes C2

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

冒頭のヘッダの部分は抜きにすれば、Typeをキーにしてjoinを利用すればよさそうかと思い
実行してみたら、「Typeがソートされていないため」エラーになり実行できませんでした。

どうするのがよいでしょうか?いい方法がありましたらご教授ください。
よろしくお願いします。

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

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

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

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

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

guest

回答2

0

こんな感じで。

Bash

1awk 'FILENAME=="B.txt"{a[$1]=$2;next} 2FNR==1{print "Name Type Number Condition Connected to";next} 3FNR==2{print "------------ ------------ ----------- ------------------- ----------------- ";next} 4{if($2 in a){$0=$0" 空白をいくつか "a[$2]};print}' B.txt A.txt

投稿2016/09/12 05:55

otn

総合スコア84555

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

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

hwhshsq

2016/09/12 06:18

回答ありがとうございます。 そのままコピーして実行してみたところ、ヘッダ部分が2回出力された後に、A.txtの内容がそのまま出力されてしまいました。 また、内容の確認なのですが 'FILENAME=="B.txt"{a[$1]=$2;next} は、B.txtを読み込み、1つめのフィールドをキーに、2つめのフィールドを要素にして配列に格納する。かと思います。 {if($2 in a){$0=$0" 空白をいくつか "a[$2]};print}' B.txt A.txt こちらの行が理解できません。 よろしければご解説お願いします。
otn

2016/09/12 07:11

> そのままコピーして実行してみたところ、ヘッダ部分が2回出力された後に、A.txtの内容がそのまま出力されてしまいました。 そんなことはないので、何かが間違っています。よく見直してください。 > こちらの行が理解できません。 2つめのフィールドがaのキーにあれば、入力行の後ろにいくつかの空白とa[$2]を注ぎ足して、入力行をプリント。
hwhshsq

2016/09/12 07:56

>>そんなことはないので、何かが間違っています。よく見直してください。 よく考えたらもともとA.txtにヘッダがついているので、このまま実行したらヘッダが2回表示されて当然でした >>2つめのフィールドがaのキーにあれば、入力行の後ろにいくつかの空白とa[$2]を注ぎ足して、入力行をプリント。 A.txtの2つめのフィールドが、という意味ですね。FILENAMEを指定しなくても、2つめは自動で読み込んでくれるということなのでしょうか。
otn

2016/09/12 13:57

> よく考えたらもともとA.txtにヘッダがついているので、このまま実行したらヘッダが2回表示されて当然でした いいえ。一度だけ表示するようになっています。2回表示されるのなら、どこか間違ってます。よく考えてください。 > FILENAMEを指定しなくても、2つめは自動で読み込んでくれるということなのでしょうか。 ファイル名指定してますけど。B.txt A.txt と。
guest

0

ご参考シェルです

bash

1#!/bin/sh 2declare -A hash_ 3while read -a lineB 4do 5 hash_["${lineB[0]}"]=${lineB[1]} 6done<B.txt 7while read line 8do 9 lineA=($(echo $line)) 10 echo -n $line 11 echo " " ${hash_["${lineA[1]}"]} 12done<A.txt

投稿2016/09/12 07:12

A.Ichi

総合スコア4070

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問