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
、たとえば小文字の場合は、残りを大文字のままにします。どうすればいいですか?
事前にどうもありがとうございました。
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
これは、次の非常に難読化されたスクリプトを使用して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にうんざりしないでください;-)。
パイプで動作するソリューション(ペーストソリューションではない)が必要で、sedソリューションよりも理解しやすい場合、これはawkを使用したソリューションです。
awk -F "[ ]" '{str=$1;$1="";print str tolower($0)}' your_file
" "
この場合、連続するスペースは単一のセパレーターと見なされるため、フィールドセパレーターを単純にすることはできません。
ファイルを読み取り、bashを使用している間、ファイルが変更されないことがわかっている場合:
paste -d " " <(cut -d " " -f 1 your_file) <(cut -d " " -f 2- your_file | tr "[:upper:]" "[:lower:]")
Linuxプラットフォームで実行する場合でも、スクリプトの最初に#!/ bin/kshを使用してください。このkshは、HpUxまたはSolarisで使用するすべての種類のタイプセット変数を受け入れます。
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