単語に基づいてファイルを2つのファイルに分割する

単語に基づいてファイルを2つのファイルに分割する

male_nominee.txtfemale_nominee.txt性別に応じて、次のファイルを2つのファイルに分割するシェルスクリプトを作成します。ファイルが male_nominee.txtすでにfemale_nominee.txt存在する場合は、内容を追加します。

female_nominee.txtとの内容を表示します。male_nominee.txt

names.txt

23|Arjun|Male

24|Akshara|Female

17|Aman|Male

19|Simran|Female

私のコード:

while IFS= read -r line;
do
    if i=$(grep "Male" names.txt)
    then
        echo "$line" >> male_nominee.txt
    fi
    if j=$(grep "Female" names.txt)
    then
        echo "$line" >> female_nominee.txt
    fi
done < "names.txt"
ls
cat male_nominee.txt
cat female_nominee.txt

names.txt私の出力には両方のファイルの内容があります。誰でもこの問題を解決するのに役立ちますか?

ベストアンサー1

また、いくつかの変更があります。

awk — シングルパス

awk -F'|' '
   $3 == "Male"   { print >> "male_nominee.txt"   }
   $3 == "Female" { print >> "female_nominee.txt" }
          ' names.txt

〜のようにjesse_bの答えただし、ファイルを一度だけ読み込み、awkスクリプト内でI / Oリダイレクトを実行します。これらの awk 回答を使用すると、データ型を変更できます。

年齢|名前|性別|高い|重量|…

|しかし、彼らは2番目と性別の間にスペースがある線を無視します。

強く打つ

#!/bin/bash
while read line
do
        if [[ $line =~ Male$ ]]
        then
                printf '%s\n' "$line" >> male_nominee.txt
        fi
        if [[ $line =~ Female$ ]]
        then
                printf '%s\n' "$line" >> female_nominee.txt
        fi
done < names.txt

私はこれがあなたが望むものだと思います。各行をシェルで読み、性別が男性か女性かをテストします。

  • 一般的にJesseの言葉は正しいです。通常これを避けるべきです  while read。バラよりシェルループを使用してテキストを処理するのはなぜ悪い習慣と見なされますか?  ただし、シェルループを使用してテキストを処理することの欠点の1つは、ループが繰り返されるたびに外部ユーティリティを呼び出すことが多いことです。この例ではそうではありません。
  • また、人為的に何かをするように指定された場合殻に完全に入っていて、 その後、宿題の規則に従う必要があります。
  • これはファイルのスペースにもっと寛大ですが、セックスの後に追加データを許可しません。
  • Bashは=~文字列を正規表現と比較します。正規表現では$終了を意味しますので、$line =~ Male$ 以下を確認してください。$line によって。 。終わる Male$line =~ Male(を連れてこないで) ただ言うと$マレピセントラという女性は男と見なされます。
  • \データのバックスラッシュ()が気になるならread -rread
  • この場合、それは重要ではないかもしれませんが(すべての行が数字で始まる場合)、通常printfecho

POSIXシェル

#!/bin/sh
while read line
do
        case "$line" in
            (*Male)
                printf '%s\n' "$line" >> male_nominee.txt
                ;;
            (*Female)
                printf '%s\n' "$line" >> female_nominee.txt
                ;;
        esac
done < names.txt
  • これはbashバージョンよりも移植性に優れています。
  • caseシェルのパターンに対して文字列をテストする従来の方法です。正規表現の代わりにファイル名一致(例:glob)パターンを使用します。
  • *グローバルパターンが一致する必要があるため、性別値の前に入れる必要があります。Male(none)を選択すると、その*項目のみが一致します。ただ言葉Male (つまり、年齢と名前なし)。一方、これは最後にマークアップを追加する必要がないことを意味します。

おすすめ記事