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

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

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

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

Q&A

解決済

3回答

361閲覧

シェルでjoinみたいなことをしたいです

退会済みユーザー

退会済みユーザー

総合スコア0

シェル

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

0グッド

0クリップ

投稿2020/09/29 16:18

編集2020/10/01 02:08

ファイルAに
aaaa
bbbb
cccc

ファイルBに
1
2
3
4
があるとして

これを引数で受け取って

aaaa1
aaaa2
aaaa3
aaaa4
bbbb1
bbbb2
bbbb3
bbbb4
cccc1
cccc2
cccc3
cccc4

こう出力したいんですけどシェル上で簡単に出来るツールはありますか?joinコマンドで出来ますか?

ちなみに

shell

1join -j 999999 -o 1.1,2.1 -t '/' a.txt b.txt

でもいけるみたいです。区切り文字をなしにするオプションがわかりませんでした。

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

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

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

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

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

guest

回答3

0

ベストアンサー

こんにちは。

xargssedを使ってみました。入力するファイルを、以下の2点

**(1) A.txt: **

text

1aaaa 2bbbb 3cccc

**(2) B.txt: **

text

11 22 33 44

として、以下のようにすると、ご質問にある出力が得られます。

shell

1$ cat A.txt | xargs -I {} sed -e 's/^/{}/' B.txt

出力:

aaaa1

aaaa2
aaaa3
aaaa4
bbbb1
bbbb2
bbbb3
bbbb4
cccc1
cccc2
cccc3
cccc4

以下は、上記コマンドを動作確認しているターミナル画面です。

イメージ説明

投稿2020/09/29 17:55

編集2020/09/29 18:44
jun68ykt

総合スコア9058

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

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

退会済みユーザー

退会済みユーザー

2020/09/30 11:33

ありがとうございました!助かりました。
jun68ykt

2020/09/30 13:00

どういたしまして。解決したようで、よかったです????
guest

0

awkで書いたらこんな感じになりました。

terminal

1$ cat aaa.txt 2aaaa 3bbbb 4cccc 5$ cat bbb.txt 61 72 83 94 10$ awk '{if(!F){++a[$0]}else{++b[$0]}}END{for(a0 in a){for(b0 in b){print a0 b0}}}' aaa.txt F=1 bbb.txt | sort 11aaaa1 12aaaa2 13aaaa3 14aaaa4 15bbbb1 16bbbb2 17bbbb3 18bbbb4 19cccc1 20cccc2 21cccc3 22cccc4

#※コメントを受けて追記
質問の本題ではないのですが、コメントの質問について回答します。

入力ファイルの引数の並びが、 aaa.txt F=1 bbb.txtとなっている部分について、
aaa.txtの読み込み処理の後、変数Fに1を代入してからbbb.txtの読み込み処理を行うことが出来るのはawkの仕様です。

これ、ashやkshやgawk以外のawkでも可能ですか?

オリジナルのawkからある仕様です。
どの時代に追加された仕様なのかまでは追っかけていませんが、少なくともawkのマニュアルには触れられています。

「man awk」の「DESCRIPTION」より引用

Any file of the form var=value is treated as an assignment, not a filename, and is executed at the time it would have been opened if it were a filename.

(DeeL翻訳のコピペ)

var=value という形式のファイルは、ファイル名ではなく代入として扱われ、ファイル名であれば開かれた時刻に実行されます。

gawkのマニュアルの「AWKプログラムの実行」の説明がさらに詳しいです。

コマンドラインで指定されたファイル名が var=val という形式ならば、それ は変数への代入であると解釈されます。変数 var は値 val に設定されます (これは、すべての BEGIN ブロックを実行したあとに行われます)。コマンドライン での変数の代入は、AWK が入力をフィールドやレコードに分割するためのセパレータ を実行時に変更するのに便利です。また、1 つのデータファイルに 対し数回処理を行う必要がある場合、状態をコントロールするのにも便利です。

投稿2020/09/29 17:48

編集2020/09/30 14:00
hidezzz

総合スコア1248

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

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

退会済みユーザー

退会済みユーザー

2020/09/30 11:33

ありがとうございました!awkでもできるんですね!
hana_yama_san

2020/09/30 12:51

おお!何かすごいぞ。 awk の引数にコマンド以降に、3個とれて、フィールドセパレータはおろか それをはさんで二個目のファイルを指定できるとは!!! これ、ashやkshやgawk以外のawkでも可能ですか?
hidezzz

2020/09/30 14:06

説明がちょっと長くなりそうなので回答のほうに追記しました。
hana_yama_san

2020/09/30 15:13

いえいえ、ありがとうございます。 実に自分の不勉強さを実感します。
guest

0

解決済みですが、この手のネタには目が無いので、
古典的?な別解を・・

[user@host ~/shell]# while read ATXT ; do for num in `cat b.txt` ; do paste <(echo "${ATXT}") <(echo "${num}") | tr -d '\t' ; done ; done < a.txt aaaa1 aaaa2 aaaa3 aaaa4 bbbb1 bbbb2 bbbb3 bbbb4 cccc1 cccc2 cccc3 cccc4 [user@host ~/shell]#

楽しんでいただける人がいれば幸甚です。

投稿2020/09/30 12:03

編集2020/09/30 12:06
hana_yama_san

総合スコア923

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

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

退会済みユーザー

退会済みユーザー

2020/10/01 02:06

ありがとうございます!色々なやり方があるんですね・・・
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問