命令不读取整个文件

时间:2015-09-20 23:03:49

标签: excel bash command

我遇到了一个奇怪的问题。我的命令不读取我从Excel保存的.txt文件。我试图以Excel中可用的所有.txt格式保存数据,但是当我运行命令时它不会读取它。实际上它似乎是读取文件的第一行,但只有当文件的第一行包含Parcela 1时。如果我从文本编辑器创建一个普通的.txt文件,无论有多少行,它都会读取它。

有谁知道我做错了什么?

我的一个代码:

awk -F"\t" '
{ if ($7 ~ /Parcela 1/)
    print;
else }' source.txt > output.txt

1 个答案:

答案 0 :(得分:1)

几乎可以肯定的是,这个问题与Unix vs Windows和旧式的Mac line-endings有关。 Excel(至少Excel上的Excel 2008和2011)可以以各种格式编写文件。这些都没有“Unix原生”行结尾。

例如,使用Excel 2011,我得到了:

$ file *.dif *.csv *.txt *.prn | sort
Data Interchange Format.dif:         Non-ISO extended-ASCII text, with CRLF line terminators
MS-DOS Comma Separated.csv:          Non-ISO extended-ASCII text, with CR line terminators
MS-DOS Formatted Text.txt:           Non-ISO extended-ASCII text, with CR line terminators
Space Delimited Text.prn:            Non-ISO extended-ASCII text, with CR line terminators
Tab Delimited Text.txt:              Non-ISO extended-ASCII text, with CR line terminators
UTF-16 Unicode Text.txt:             Little-endian UTF-16 Unicode text, with CRLF line terminators
Windows Comma Separated.csv:         ISO-8859 text, with CRLF line terminators
Windows Formatted Text.txt:          ISO-8859 text, with CRLF line terminators
$ ule *.dif *.csv *.txt *.prn | sort
Data Interchange Format.dif: 2301 DOS, No final EOL
MS-DOS Comma Separated.csv: 103 Mac, No final EOL
MS-DOS Formatted Text.txt: 103 Mac, No final EOL
Space Delimited Text.prn: 104 Mac
Tab Delimited Text.txt: 103 Mac, No final EOL
UTF-16 Unicode Text.txt: 103 Unix, 103 Mac, No final EOL, 11019 null bytes
Windows Comma Separated.csv: 103 DOS, No final EOL
Windows Formatted Text.txt: 103 DOS, No final EOL
$

文件名对应于从Excel下拉框中选择的保存格式。 file的输出显示,所有格式都不是标准的Unix文本文件。 ule(统一线路结束)计划是我自己设计的一个;它用于默认的“检查”模式。有趣的是,大多数文件没有最终的行序列;数据在没有最终换行符的情况下停止。

$ ule -h
Usage: ule [-bcdhmnosuzV] [file ...]
  -b  Create backups of the files
  -c  Check line endings (default)
  -d  Convert to DOS (CRLF) line endings
  -h  Print this help and exit
  -m  Convert to MAC (CR) line endings
  -n  Ensure line ending at end of file
  -o  Overwrite original files
  -s  Write output to standard output (default)
  -u  Convert to Unix (LF) line endings
  -z  Check for zero (null) bytes
  -V  Print version information and exit

$

在Unix系统上,行以换行符(NL - aka LF或换行符)结束。在Windows上,通常行以CRLF,回车和换行结束;在经典的Mac OS上(在Mac OS X之前),显然对于带有Office产品的MS-DOS,这些行以CR,回车结束。

awk读取行。如果您尝试处理其中一个仅包含CR行结尾的文件,awk会认为该文件包含一行。如果您尝试使用CRLF行结尾处理其中一个文件,awk将识别行OK(它们在LF处结束),但会将CR视为最后一个字段的一部分。

因此,根据您的真实情况,您应该使用“Windows *”格式之一。这些文件中的'Parcela 1'行是92,99和102。

awk -F"\t" '{ if ($7 ~ /Parcela 1/) print; }' "Windows Formatted Text.txt"
                9/6/19        (Parcela 1)FINANCIAMENTO FATURA JULHO EM 4X    (Dividido)        "($1,052.38)"
                9/6/19        (Parcela 1)ROUPAS GUI    6.1.1.10 - DESPESAS PESSOAIS:6.1.1.10.004 - VESTUARIO        ($44.70)
                9/6/19        "(Parcela 1)TROCA 2 PNEUS DIANTEIROS, BALANCEAMENTO E ALINHAMENTO FOX"    6.1.1.02 - TRANSPORTE:6.1.1.02.001 - AUTOMOVEL:6.1.1.02.001 - MANUTENCAO    ($282.68)

任何其他格式都会以某种形式或形式出现问题,直到您按照awk识别的格式进行按摩,例如:通过运行:

tr '\r' '\n' < "MS-DOS Comma Separated Text.csv" > "Unix Comma Separated Text.csv"

然后,您可以安全地将awk应用于“Unix Comma Separated Text.csv”文件。