0

我有这个文件:

$ cat file
1515523  A45678BF141  A11269151
2234545  A45678BE145  A87979746
5432568  A45678B2123  A40629187
7234573  A45678B4154  A98879129
8889568  A45678B5123  A13409137
9234511  A45678B9176  A23589941
3904568  A45678B7123  A52329165
3234555  A45678B1169  A23589497
9643568  A45678B6123  A39969112
1234547  A45678B2132  A40579243

这个脚本:

cat file | awk '{FS = " "} {print $1" "$3" "$5}'| awk '{
    n = split($3, a, "");
    s = "";
    for (i = 1; i <= n; i += 2) s = s a[i+1] a[i];
    print $1, substr($2, length($2)-3, 4), s
}'| cut -d" " -f3,1  >  output

当我用 打开输出时vi,我有:

1515523  F141  11621915^M
2234545  E145  78797964^M
5432568  2123  04261978^M
7234573  4154  89781992^M
8889568  5123  31041973^M
9234511  9176  32859914^M
3904568  7123  25231956^M
3234555  1169  32854979^M
9643568  6123  93691921^M
1234547  2132  04752934^M

我不知道为什么要获取^M,因为当我打算运行awk代码段时:

cat imei | awk '{FS=" "} {print $2","$1}'

输出是错误的,即它不交换列,因为它不打印第二列。关于可能发生的事情的任何想法?

4

4 回答 4

3

数据文件中有回车符(^MControl-M)。它可能在某个时候来自 Windows 机器。

当你打印时$2","$1(它$2与一个包含逗号的字符串连接,然后$1——我看了几眼才知道它到底在做什么),回车使第二列覆盖第一列。

使用或类似工具查看数据文件od -c以查看其中的回车符。

您可以使用dos2unixtr其他各种技术将文件从 DOS/Windows 格式转换为 Unix 格式。

此外,鉴于显示的数据格式,我希望不使用-F " "(或FS = " "等效的 ),以便您拥有列$1$2$3,这比使用所示的第 1、3、5 列更明显。如果您希望输出在列之间有两个空格,则可以将 OFS 设置为双空格。

于 2013-08-12T16:34:19.200 回答
2
$ dos2unix file
$ awk '{split($3,a,""); print $1, substr($2,8), a[3]a[2]a[5]a[4]a[7]a[6]a[9]a[8]}' file
1515523 F141 11621915
2234545 E145 78797964
5432568 2123 04261978
7234573 4154 89781992
8889568 5123 31041973
9234511 9176 32859914
3904568 7123 25231956
3234555 1169 32854979
9643568 6123 93691921
1234547 2132 04752934
于 2013-08-12T17:33:43.230 回答
0

由于您使用的是 awk,因此您不需要 dos2unix。

只需插入

 gsub(/\r/,"");

作为 awk 脚本中的第一条语句,它会清理读入的每一行。后续匹配或处理不会得到任何“回车”字符。

于 2013-08-13T06:26:13.680 回答
0

perl 'one liner' 怎么样(带有续行)

$ dos2unix file
$ perl -lane \
'$xxxx = substr($F[1],-4);
@c = split(//,$F[2]);
print "$F[0] $xxxx $c[2]$c[1]$c[4]$c[3]$c[6]$c[5]$c[8]$c[7]"' file
于 2013-08-13T08:13:56.543 回答