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

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

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

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

解決済

2回答

4549閲覧

2つのファイルを1行ずつ数値比較したい

ktkch.

総合スコア6

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

0グッド

0クリップ

投稿2020/08/20 06:49

前提・実現したいこと

二つのファイルを一行ずつ数値比較をするものです。
例を下記します。

a.txt
1
2
3
4
5

b.txt
5
4
3
2
1

c.txt




該当のソースコード

while read line; do a=$line while read line; do b=$line if [ $a -eq $b ]; then echo - >>"c.txt" elif [ $a -gt $b ]; then echo → >>"c.txt" else echo ← >>"c.txt" fi done < b.txt done < a.txt

試したこと

当たり前なのですが whileを2重にしているので比較対象、回数が期待と違います。

補足情報(FW/ツールのバージョンなど)

cygwin 3.1.6-1

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

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

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

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

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

guest

回答2

0

以下bash限定です。(shでは動きません。)
execを使ってb.txtをファイルディスクリプタ指定でオープンしておいて(「exec 9< b.txt」の部分)、
a.txtの読み込みに合わせてb.txtをreadを-u オプション付きでファイルディスクリプタ指定で読み込めば(「read -u 9 line」の部分)良いです。

bash

1#! /bin/bash 2 3rm -f c.txt 4 5exec 9< b.txt 6while read line; do 7 a=$line 8 read -u 9 line 9 b=$line 10 if [ $a -eq $b ]; then 11 echo - >>"c.txt" 12 elif [ $a -gt $b ]; then 13 echo>>"c.txt" 14 else 15 echo>>"c.txt" 16 fi 17done < a.txt

ついでにa.txtの読み込みもb.txtの読み込みと同様に変更すると次のようになります。

bash

1#! /bin/bash 2 3rm -f c.txt 4 5exec 8< a.txt 6exec 9< b.txt 7while read -u 8 line; do 8 a=$line 9 read -u 9 line 10 b=$line 11 if [ $a -eq $b ]; then 12 echo - >>"c.txt" 13 elif [ $a -gt $b ]; then 14 echo>>"c.txt" 15 else 16 echo>>"c.txt" 17 fi 18done 19

以下実行結果です。

terminal

1$ cat a.txt 21 32 43 54 65 7 8$ cat b.txt 95 104 113 122 131 14 15$ ./hoge2.bash 16$ cat c.txt 171819-  202122 23$ ./hoge3.bash 24$ cat c.txt 252627-  282930

投稿2020/08/20 08:24

編集2020/08/20 08:27
hidezzz

総合スコア1248

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

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

ktkch.

2020/08/24 11:08

分かりやすく、丁寧な回答ありがとうございました。
guest

0

ベストアンサー

いま手元にcygwinがないので直接試せていませんが、以下でおそらく出来ると思います。

paste a.txt b.txt | awk '{print ($1<$2)?"→":($1==$2)?"ー":"←"}' > c.txt

投稿2020/08/20 07:24

KojiDoi

総合スコア13692

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

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

ktkch.

2020/08/20 07:57

出来ました!迅速な対応ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問