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 回答
3

这可以通过以下方式更轻松地完成sed

sed 's/^ *//; s/; */;/g'

这假设您所有的空格都只是空格字符。要包含所有空白字符,请查看POSIX 字符类

sed 's/^[[:space:]]*//; s/;[[:space:]]*/;/g'

演示(在 OSX 上):

% echo 'Firstname LastName; 123-4567; Job Title
    Firstname LastName;   123-4567;      Job Title
Firstname LastName;      123-4567; Job Title' | sed 's/^[[:space:]]*//; s/;[[:space:]]*/;/g'
Firstname LastName;123-4567;Job Title
Firstname LastName;123-4567;Job Title
Firstname LastName;123-4567;Job Title

如果您的版本sed不支持用分号分隔语句,您可以使用以下命令发出单独的命令-e

% echo 'Firstname LastName; 123-4567; Job Title
    Firstname LastName;   123-4567;      Job Title
Firstname LastName;      123-4567; Job Title' | sed -e 's/^[[:space:]]*//' -e 's/;[[:space:]]*/;/g'
Firstname LastName;123-4567;Job Title
Firstname LastName;123-4567;Job Title
Firstname LastName;123-4567;Job Title
于 2012-01-07T00:37:56.703 回答
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 回答
1

只需在您的字段编号上执行 gsub,例如:

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

这将用空替换所有前导空格,同时保留所有其他空格。该gsub函数使用指定变量上的新值对给定模式进行全局替换。

在这种情况下,模式是^ *,表示字符串的开头后跟零个或多个空格。替换模式是一个空字符串,被操作的变量是行中的第一个字段,$1

下面的脚本显示了这一点,对于行中的所有列,由i变量控制。NF是当前行中的字段数,$i指的是 position 的字段i

$ 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 回答
0

尝试这个

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