59

UNIXデータファイルから最初の22文字を取得しようとしています。データは次のようになります。

最初の12文字は1列目で、次の10文字は2列目です。

000000000001199998000180000     DUMMY RAG #         MFR NOT ST            1999980    ZZ-            0        0              0ZZ-
000000000002199998000180000     DUMMY RAG #         MFR NOT ST            1999980    ZZ-            0        0              0ZZ-
000000000003199998000180000     DUMMY RAG #         MFR NOT ST            1999980    ZZ-            0        0              0ZZ-
000000000004199998000180000     DUMMY RAG #         MFR NOT ST            1999980    ZZ-            0        0              0ZZ-
000000000005199998000180000     DUMMY RAG #         MFR NOT ST            1999980    ZZ-            0        0              0ZZ-
000000000006199998000180000     DUMMY RAG #         MFR NOT ST            1999980    ZZ-            0        0              0ZZ-
4

3 に答える 3

108

cut

$ cut -c-22 file
0000000000011999980001
0000000000021999980001
0000000000031999980001
0000000000041999980001
0000000000051999980001
0000000000061999980001

2番目の要件を理解している場合は、最初の22文字を長さ10と12の2つの列に分割するのsedが最適です。

$ sed -r 's/(.{10})(.{12}).*/\1 \2/' file
0000000000 011999980001
0000000000 021999980001
0000000000 031999980001
0000000000 041999980001
0000000000 051999980001
0000000000 061999980001
于 2013-01-22T15:54:52.017 に答える
3

sudo_Oは素晴らしいカットとsedソリューションを提供しました、私はちょうどawkワンライナーを追加しました:

awk 'BEGIN{FIELDWIDTHS="22"} {print $1}' file

echo "000000000001199998000180000     DUMMY RAG"|awk 'BEGIN{FIELDWIDTHS="22"} {print $1}'
0000000000011999980001

空の文字を使用する(要件によって異なります。スペースをスキップするか、出力に含めてカウントします)

空白スペースをカウントして出力にも表示する必要がある場合:(上記のcmdを変更する必要はありません)

echo "0 0 0 0 00000001199998000180000"|awk 'BEGIN{FIELDWIDTHS="22"} {print $1}'                                                                         
0 0 0 0 00000001199998

それらのスペースをスキップしたい場合:(迅速で汚い)

echo "0 0 0 0 00000001199998000180000"|sed 's/ //g'|awk 'BEGIN{FIELDWIDTHS="22"} {print $1}'                                                            
0000000000011999980001
于 2013-01-22T16:20:23.330 に答える
2

#!/bin/bashこれは実際には、外部プログラムを使用せずにBashで実行できます(これを使用するスクリプトは、代わりにで始まる必要#!/bin/shがあり、POSIXシェルに準拠しません)。式${VARIABLE:offset:length}:lengthオプションの場合)を使用します。

#!/bin/bash

STR="123456789"

echo ${STR:0:1}
echo ${STR:0:5}
echo ${STR:0:10}
echo ${STR:5:10}
echo ${STR:8:10}

次の出力があります:

1
12345
123456789
6789
9

開始オフセットはゼロから始まり、長さは少なくとも1でなければならないことに注意してください。括弧内に負のオフセットを使用して、文字列の右側からオフセットすることもできます。

echo ${STR:(-5):4}

5678

ファイルを読み取るには、各行の最初の8文字を繰り返しフェッチし、それらを端末に出力します。次のwhileようなループを使用します。

while read LINE
    do echo "${STD:0:8}"
done < "/path/to/the/text_file"

Bash文字列操作について知っておく必要があるすべての人にとって非常に役立つリソースはここにあります:https ://tldp.org/LDP/abs/html/string-manipulation.html

于 2020-10-18T14:41:55.843 に答える