我有一个CSV文件,看起来像这样
AS2345,ASDF1232,Mr. Plain Example,110 Binary ave.,Atlantis,RI,12345,(999)123-5555,1.56 AS2345,Mrs. Plain Example,1121110 Ternary st. 110 Binary ave..,Liberty City,110 Ternary ave.,Some City,1.56
我需要排序它的行长度包括空格。以下命令不会
包括空格,有没有办法修改它,所以它会为我工作?
cat $@ | awk '{ print length,$0 }' | sort -n | awk '{$1=""; print $0}'
回答
cat testfile | awk '{ print length,$0 }' | sort -n -s | cut -d" " -f2-
或者,对任何等长线进行原始(可能是无意的)子排序:
cat testfile | awk '{ print length,$0 }' | sort -n | cut -d" " -f2-
在这两种情况下,我们已经解决了你所声称的问题,从awk开始你的最后剪辑。
匹配长度的线 – 在领带的情况下做什么:
该问题没有指定是否需要进一步排序以匹配长度的行。我假设这是不必要的,并建议使用-s(–stable)来防止这些行相互排序,并保持它们在输入中出现的相对顺序。
(那些想要更多地控制排序这些关系的人可能会看到sort的–key选项。)
为什么问题的尝试解决方案失败(awk行重建):
有趣的是注意以下两者之间的区别:
echo "hello awk world" | awk '{print}' echo "hello awk world" | awk '{$1="hello"; print}'
它们分别产生
hello awk world hello awk world
relevant section of (gawk’s) manual只提到,当你改变一个字段时,awk将重建整个$ 0(基于分隔符等)。我想这不是疯狂的行为。它有这:
“最后,有时候强迫awk重建整个记录,使用字段和OFS的当前值是很方便的。为此,使用看似无害的赋值:
$1 = $1 # force record to be reconstituted print $0 # or whatever else with $0
“这迫使awk重建记录。
测试输入包括一些等长的线:
aa A line with MORE spaces bb The very longest line in the file ccb 9 dd equal len. Orig pos = 1 500 dd equal len. Orig pos = 2 ccz cca ee A line with some spaces 1 dd equal len. Orig pos = 3 ff 5 dd equal len. Orig pos = 4 g