ファイル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ページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
ベストアンサー
こんにちは。
xargs
とsed
を使ってみました。入力するファイルを、以下の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総合スコア9058
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総合スコア1248
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/30 12:51
2020/09/30 14:06
2020/09/30 15:13
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総合スコア923
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2020/10/01 02:06
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2020/09/30 11:33
2020/09/30 13:00