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

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

新規登録して質問してみよう
ただいま回答率
85.35%
シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

Linux

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

sh

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

Q&A

解決済

3回答

1732閲覧

シェルスクリプト:特定のレコードを出力したい(awk uniq sort print)

710LOVER

総合スコア10

シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

Linux

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

sh

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

0グッド

0クリップ

投稿2021/11/02 10:16

前提・実現したいこと

sqlで抽出したデータで以下の機能をするスクリプトを作成しています。
①各レコードで対象の項目(カラム)に重複が無いかチェックする。
②該当するレコードを出力する。

①の機能は作成できましたが、②の機能を作るのに四苦八苦しております。
該当するレコードを出力したいのですが、重複チェックした部分しか出力できずにいます。

発生している問題

test_checked.txt

27 27 0 27 27 0

理想とする出力結果

test_checked.txt

004 3456 27 27 0 テスト4 005 7890 27 27 0 テスト5

作成してるスクリプト

test_check.sh

#!/bin/ksh ### 重複チェック結果の出力先 ### TXT=/hoge/test/test_checked.txt ### sqlで抽出したファイルの重複チェック結果を出力する ### #$1 : 抽出したファイル(test.txt) #awk '{print $3,$4,&5}':重複を確認したい項目 cat $1 | awk '{print $3,$4,$5}' | sort | uniq -d > $TXT ### 出力ファイルサイズが0より大きいことを真として条件式でメッセージを出力する ### if [ -s "$TXT" ]; then echo "重複がありました。" else echo "重複はありませんでした。" fi

抽出データ

test.txt

001 1234 8 19 14 テスト1 002 5678 6 4 0 テスト2 003 9012 7 8 6 テスト3 004 3456 27 27 0 テスト4 005 7890 27 27 0 テスト5 006 1123 8 19 26 テスト6

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

teratermでの作業となっています。
他に必要な情報がありましたら申してください。

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

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

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

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

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

winterboum

2021/11/02 11:21

「重複している」とは、 「3,4,5 の 3項目が全く同じデータがある」ということですか?
710LOVER

2021/11/03 06:54

そうです。 3,4,5の3項目が他のレコードでも同じ数値になっていることを「重複している」としております。 質問の回答になっていなかったらごめんなさい。
winterboum

2021/11/03 08:26

回答になってます。 で、 もういろいろ回答があがってますから大丈夫ですね
guest

回答3

0

ベストアンサー

test.txt の内容を見ると、3,4,5列目の幅の合計は固定(11*3=33桁)の様なので、GNU coreutils の uniq コマンドで処理してみます。

テストのために重複行の位置を変更しておきます。

test.txt

1001 1234 8 19 14 テスト1 2002 5678 6 4 0 テスト2 3003 9012 7 8 6 テスト3 4004 3456 27 27 0 テスト4 5005 1123 8 19 26 テスト5 6006 7890 27 27 0 テスト6

bash

1$ uniq --version 2uniq (GNU coreutils) 8.32 3 4$ cat test.txt | sort -k3,5 | uniq -D -f 2 -w 33 # 先頭の2列を無視、直後の33文字で比較 5004 3456 27 27 0 テスト4 6006 7890 27 27 0 テスト6

投稿2021/11/02 12:28

編集2021/11/02 12:55
melian

総合スコア20655

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

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

710LOVER

2021/11/04 00:51

夜分遅くに回答ありがとうございます! 実データで試してうまくいきました!
guest

0

連想配列を使えるスクリプト言語を使うのが手っ取り早いと思います。
まあ、データが少ないならこんな方法でどうでしょうか?

#!/bin/ksh dst=/hoge/test/dst TXT=/hoge/test/test_checked.txt rm -f $dst/* rm -f $TXT cnt1=`cat $1 | wc -l` cat $1 | \ while read line do a=`echo $line | cut -f 3` b=`echo $line | cut -f 4` c=`echo $line | cut -f 5` echo $line >>"$dst/${a}-${b}-${c}" done cnt2=`ls -1 $dst` if [ $cnt1 -eq $cnt2 ] then echo "重複はありませんでした。" else echo "重複がありました。" ls -1 $dst | \ while read f do n=`cat "$dst/$f" | wc -l` if [ $n -gt 1 ] then cat "$dst/$f" >>$TXT fi done fi

投稿2021/11/02 12:04

takasima20

総合スコア7464

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

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

710LOVER

2021/11/04 01:09

夜分に回答ありがとうございます! やはり連想配列が使いこなせるとつよいですね… 連想配列の活用の仕方とても参考になりました!
guest

0

連想配列を利用すれば、awkだけでできそうな気がしますね。

awk

1# test.awk 2{ 3 n[$3,$4,$5]++ 4 t[$3,$4,$5,n[$3,$4,$5]]=$0 5} 6END{ 7 for(i in n){ 8 if(n[i]>1){ 9 for(j=1; j<=n[i]; j++){ 10 print t[i,j] 11 } 12 } 13 } 14}
$ awk -f test.awk test.txt

投稿2021/11/02 11:21

KojiDoi

総合スコア13692

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

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

710LOVER

2021/11/04 01:07

夜分遅くに回答ありがとうございます! 実データでも確認取れました! ENDブロック初めて見ました、とても参考になります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問