2

次の形式のファイルがあります。

Firstname LastName; 123-4567; Job Title
    Firstname LastName;   123-4567;      Job Title
Firstname LastName;      123-4567; Job Title
...

awk を使用してファイルを構文解析し、makedbm で読み取り可能な形式にしようとしています (カスタム NIS マップを作成するため)。フィールドセパレータはセミコロンです。各行の各フィールドから先頭の空白をすべて削除できるようにする必要がありますが、名前フィールドとタイトル フィールドにはスペースを残します。ありがとう。

4

5 に答える 5

5

leading space from all fieldsを削除して保持したい場合は、次のspace in between the Names and Job title fieldsようにすることができます -

awk -F";" -v OFS=";" '{for (i=1;i<=NF;i++) gsub (/^ */,"",$i);print}' INPUT_FILE

テスト:

[jaypal:~/Temp] cat file
Firstname LastName; 123-4567; Job Title
    Firstname LastName;   123-4567;      Job Title
Firstname LastName;      123-4567; Job Title

[jaypal:~/Temp] awk -F";" -v OFS=";" '{for (i=1;i<=NF;i++) gsub (/^ */,"",$i);print}' file
Firstname LastName;123-4567;Job Title
Firstname LastName;123-4567;Job Title
Firstname LastName;123-4567;Job Title
于 2012-01-07T00:20:38.147 に答える
1

次のように、フィールド番号でgsubを実行するだけです。

gsub (/^ */, "", $1);

これにより、他のすべてのスペースはそのままになりながら、すべての先頭のスペースが何も置き換えられません。このgsub関数は、指定されたパターンを、指定された変数の新しい値でグローバルに置換します。

この場合、パターンは^ *です。これは、文字列の先頭の後にゼロ個以上のスペースが続くことを意味します。置換パターンは空の文字列であり、操作対象の変数は行の最初のフィールド$1です。

次のトランスクリプトは、変数によって制御される行のすべての列について、これが実際に動作していることを示しています。は現在の行のフィールド数であり、位置のフィールドを参照します。iNF$ii

$ cat file | awk -F\; -vOFS=\; '{
    for (i = 1; i <= NF; i++) {
        gsub (/^ */, "", $i);
    };
    print}'
Firstname LastName;123-4567;Job Title
Firstname LastName;123-4567;Job Title
Firstname LastName;123-4567;Job Title
于 2012-01-07T00:22:08.430 に答える
1

多くの方法で目標を達成できます。

楽しみのためにもう1つ追加してください:

awk -v OFS=";" -F'; *' '{gsub(/^ */,"")}$1=$1' file

さらに短い:

awk -v OFS=";" -F'; *' 'gsub(/^ */,"", $1)' file

テスト

kent$  echo "Firstname LastName; 123-4567; Job Title
    Firstname LastName;   123-4567;      Job Title
Firstname LastName;      123-4567; Job Title
"|awk -v OFS=";" -F'; *' '{gsub(/^ */,"")}$1=$1'
Firstname LastName;123-4567;Job Title
Firstname LastName;123-4567;Job Title
Firstname LastName;123-4567;Job Title


kent$  echo "Firstname LastName; 123-4567; Job Title
    Firstname LastName;   123-4567;      Job Title
Firstname LastName;      123-4567; Job Title
"|awk -v OFS=";" -F'; *' 'gsub(/^ */,"",$1)'
Firstname LastName;123-4567;Job Title
Firstname LastName;123-4567;Job Title
Firstname LastName;123-4567;Job Title
于 2012-01-07T00:46:07.467 に答える
0

これを試して

{
    gsub(";  *",";")
    gsub("^  *","")
    print
}
于 2012-01-07T00:21:57.640 に答える