使用Awk删除空格

3

我有一个文件,格式为:

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

我正在尝试使��awk将文件解析为makedbm可读的形式(以制作自定义NIS映射)。字段分隔符是分号。我需要能够从每行的每个字段中删除所有前导空格,但保留名称字段和标题字段中的空格。谢谢。


你是指在“名字 姓氏”和“职位名称”之间留空格,还是在这些字段前面添加空格? - jaypal singh
2
@Johnsyweb,我喜欢那个链接。从现在开始,我仍然不会在提问之前进行任何调查,但我会确保在所有问题中加入短语“我已经检查了NSURLconnection。我无法集成该代码。”你认为这样做会得到更好的回应吗? :-) - paxdiablo
5个回答

5
如果您想从所有字段中删除前导空格,并保留名称和职位字段之间的空格,则可以这样做 -
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

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

1

只需对字段编号执行 gsub,例如:

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

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

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

以下记录显示了此操作,适用于行中的所有列,由变量i控制。NF 是当前行中字段的数量,并且$i 指的是位置为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

OP明确表示他想要“从每行的每个字段中删除所有前导空格”。 - lhf
@lhf,我的误解,我以为第一列和第三列完全不用改动。重新阅读后,你是对的,只有非前导空格应该保持不变-根据需要进行修改。 - paxdiablo
但现在它看起来更像是Jaypal的答案,所以我很可能在一段时间后删除它。 - paxdiablo
@paxdiable 哈哈……我看了你的回答,觉得可能是我误解了他的问题,并发布了第二个选项只从第二列中删除前导空格。 :) - jaypal singh

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

0

试试这个

{
    gsub(";  *",";")
    gsub("^  *","")
    print
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接