Bash 为什么Awk';s print在格式化两个简单的管道字段时表现得很疯狂?

Bash 为什么Awk';s print在格式化两个简单的管道字段时表现得很疯狂?,bash,awk,sed,Bash,Awk,Sed,晚上好 我在处理awk的最后一个字段时遇到了一个奇怪的现象,我想与您分享。 我有一个社交网络日志文件,其中包含一些用|分隔的字段。 这些字段在imho中不重要,但它们出现在此格式中。 id | name | lastname | | |社交|媒体|使用(无任何内容) 有9个单独的字段 每行包含一个用户。e、 g.^随机数字|阿里斯|某物| | |脸书$$ 我们的目标是找到一种方法,为每一个使用的社交媒体找到一个总数 grep -v '^#' $3 | awk -F\| '{print $9}'

晚上好

我在处理awk的最后一个字段时遇到了一个奇怪的现象,我想与您分享。
我有一个社交网络日志文件,其中包含一些用|分隔的字段。 这些字段在imho中不重要,但它们出现在此格式中。
id | name | lastname | | |社交|媒体|使用(无任何内容)
有9个单独的字段

每行包含一个用户。e、 g.^随机数字|阿里斯|某物| | |脸书$$

我们的目标是找到一种方法,为每一个使用的社交媒体找到一个总数

grep -v '^#' $3 | awk -F\| '{print $9}' | sort | uniq -c | awk '{print $1$2}'  
第一个命令从我的文件中删除被视为注释的#

第二个命令查找并打印字段9,该字段对应于该字段 使用的社交媒体。这是最后一个字段,因此我猜它将在\n结尾

之后,我对字段进行排序和计数,最后一个awk按如下方式打印输出:

884Blogger  
1105Facebook  
1326Flickr  
1104Google+  
1105Instagram  
1105LinkedIn  
1325Twitter  
1546Youtube  
Blogger  
 884  
Facebook  
 1105  
Flickr  
 1326  
Google+  
 1104  
Instagram  
 1105
LinkedIn  
 1105  
Twitter  
 1325  
Youtube  
 1546  
如果我在最后一次尝试此命令:
awk{print$2$1}然后发生了一些奇怪的事情。
如果我将其存储在一个文件中,我可以看到如下所示:

884Blogger  
1105Facebook  
1326Flickr  
1104Google+  
1105Instagram  
1105LinkedIn  
1325Twitter  
1546Youtube  
Blogger  
 884  
Facebook  
 1105  
Flickr  
 1326  
Google+  
 1104  
Instagram  
 1105
LinkedIn  
 1105  
Twitter  
 1325  
Youtube  
 1546  
如果我试图从终端查看输出表单,我会看到:

884gger  
1105book  
1326kr  
1104le+  
1105agram  
1105edIn  
1325ter  
1546ube  
所需输出为:
博客884
Facebook 1105
Flickr 1326
谷歌+1104
Instagram 1105
LinkedIn 1105
推特1325
Youtube 1546

我搜索了所有关于sed或awk的RS、ORS或FRS的信息,我也尝试了printf或print,但我找不到任何匹配的,甚至在同一行中几乎没有单词空间号。无论我如何打印这些行。但是,当我试图打印一个虚拟文件时,我从main复制粘贴了20行,一切都很顺利。同样,如果我尝试打印f或打印字段8或7,一切都很顺利


这个问题的解决方案在哪里?在9500个文件的长文件中?或者在单词后面有换行符?您认为如何?

您的数据很可能包括
\r\n
行尾。第一次运行
dos2unix文件

您也可以使用此功能消除大多数管道

$ awk -F\| '!/^#/{a[$9]++} END{for(k in a) print k,a[k]}' file | sort 

您的数据很可能包括
\r\n
行结尾。第一次运行
dos2unix文件

您也可以使用此功能消除大多数管道

$ awk -F\| '!/^#/{a[$9]++} END{for(k in a) print k,a[k]}' file | sort 
替换为GNU awk:

awk '{print $2$1}'

处理Unix和DOS/Windows行结尾。

替换为GNU awk:

awk '{print $2$1}'


处理Unix和DOS/Windows行结尾。

请在问题中添加示例输入(多行)和该示例输入所需的输出。一个单词
dos2unix
。。。或者
awk-v RS=“\r?\n”…
multichar-RS需要GNU
awk
@JamesBrown:您的速度快了一点。请将示例输入(多行)和该示例输入所需的输出添加到您的问题中。一个字
dos2unix
。。。或者
awk-vrs=“\r?\n”…
multichar-RS需要GNU
awk
@JamesBrown:你快了一点。非常感谢!我的代码(在逗号之后)工作得很好。一个小的细节改进:将
*
替换为
{0,1}
非常感谢!我的代码(在逗号之后)工作得很好。一个小的细节改进:用
{0,1}
'!/^#/确实移除了一根管道。这是真的。谢谢!!/^#/确实拆下了一根管子,是真的,谢谢!