4

file.txtがあり、ファイルの各行は次のようになっています。

ABLED   EY B AH L D
ABLER   EY B AH L ER

各行の2番目の部分が必要です。EY B AH L DまたはEY B AH L ER、たとえば小文字の場合は、残りを大文字のままにします。どうすればいいですか?

事前にどうもありがとうございました。

4

6 に答える 6

8
while read first second; do
    second=$(echo "$second" | tr [:upper:] [:lower:])
    printf '%s\t%s\n' "$first" "$second"
done < file.txt

出力:

ABLED   ey b ah l d
ABLER   ey b ah l er

KornShell、pdksh、またはBashで呼び出すことなくそれを行う他の2つの方法tr

変数に「小文字」フラグを設定します(KornShellおよび互換性のあるシェルのみ)。

typeset -l second
while read first second; do
    printf '%s\t%s\n' "$first" "$second"
done < file.txt

Bashの大文字小文字変更パラメーター拡張修飾子を使用します(Bashのみ!):

while read first second; do
    printf '%s\t%s\n' "$first" "${second,,}"
done < file.txt
于 2012-12-18T14:50:14.807 に答える
1

これは、次の非常に難読化されたスクリプトを使用してsedで実行できます。

sed -e 'h;s/ .*//;x;s/[^ ]* //;y/AZERTYUIOPQSDFGHJKLMWXCVBN/azertyuiopqsdfghjklmwxcvbn/;H;x;s/\n/ /' your_file

説明

スクリプトの最初の部分(h;s/ .*//;x;s/[^ ]* //)は、部分をホールドスペースの最初のスペースの前の行に配置し、行の一部をパターンスペースの最初のスペースの後に配置します。

  • h:ホールドスペースの実際の行をコピーします。
  • s/ .*//:1番目のスペースの前の文字のみをパターンスペースに保持します。
  • x:ホールドとパターンスペースを切り替えます。
  • s/[^ ]* //:1番目のスペースの後の文字のみをパターンスペースに保持します。

これで、ラインの最初の部分がホールドスペースに、2番目の部分がパターンスペースに配置されました。2番目の部分を小文字にする必要があるので、使用しますy/AZERTYUIOPQSDFGHJKLMWXCVBN/azertyuiopqsdfghjklmwxcvbn/(はい、私はAZERTYキーボードを持っています)。

次に、ファイルの1番目と2番目の部分を一緒に戻すだけです。

  • H:スペースを保持するためにパターンスペースを追加します。
  • x:パターンスペースを交換し、スペースを保持します。
  • s/\n/ /:コマンドのをスペース\nに置き換えます。H

sedsynthaxにうんざりしないでください;-)。

于 2012-12-18T19:15:56.467 に答える
0

パイプで動作するソリューション(ペーストソリューションではない)が必要で、sedソリューションよりも理解しやすい場合、これはawkを使用したソリューションです。

awk -F "[ ]" '{str=$1;$1="";print str tolower($0)}' your_file

" "この場合、連続するスペースは単一のセパレーターと見なされるため、フィールドセパレーターを単純にすることはできません。

于 2012-12-18T19:34:52.123 に答える
0

ファイルを読み取り、bashを使用している間、ファイルが変更されないことがわかっている場合:

paste -d " " <(cut -d " " -f 1 your_file) <(cut -d " " -f 2- your_file | tr "[:upper:]" "[:lower:]")
于 2012-12-18T19:23:54.937 に答える
0

Linuxプラットフォームで実行する場合でも、スクリプトの最初に#!/ bin/kshを使用してください。このkshは、HpUxまたはSolarisで使用するすべての種類のタイプセット変数を受け入れます。

于 2013-04-11T11:02:30.867 に答える
-1

Pythonスクリプト:

import sys
for l in sys.stdin.read().splitlines():
    try:
        head,rest = l.split(' ', 1)
        print head, rest.lower()
    except: print l

次のように実行します(スクリプトをというファイルに保存すると仮定しますfilter.py)。

$ python filter.py < file.txt
于 2012-12-18T14:58:03.567 に答える