我想要做的是使用awk从一列文件创建一个表(最多= 4行)。 我有一个文件:
1 a,b
2 r,i
3 w
4 r,t
5 o,s
6 y
欲望输出:
1 a,b 5 o,s
2 r,i 6 y
3 w
4 r,t
到目前为止,我只是将行分成不同的文件并且"粘贴"他们合而为一。我会欣赏任何更复杂的方法。
答案 0 :(得分:3)
将[14:12:36] Size main.css : 1234 B
[14:12:36] Size main.css.map : 1234 B
与联接行和awk
组合在一起以完美打印它们:
column
输出:
awk -v max=4 '
{ i = (NR-1) % max + 1; line[i] = line[i] "\t" $0 }
END { for(i=1; i<=max && i<=length(line); i++) print line[i] }' file | column -t -s $'\t'
答案 1 :(得分:3)
$ cat tst.awk
BEGIN {
numRows = 4
OFS = "\t"
}
{
rowNr = (NR - 1 ) % numRows + 1
if ( rowNr == 1 ) {
numCols++
}
val[rowNr,numCols] = $0
}
END {
for (rowNr=1; rowNr<=numRows; rowNr++) {
for (colNr=1; colNr<=numCols; colNr++) {
printf "%s%s", val[rowNr,colNr], (colNr<numCols ? OFS : ORS)
}
}
}
$
$ awk -f tst.awk file
1 a,b 5 o,s
2 r,i 6 y
3 w
4 r,t
答案 2 :(得分:1)
另:
$ awk ' {
i=(NR%4) # using modulo indexed array
a[i]=a[i] (a[i]==""?"":" ") $0 # append to it
}
END { # in the END
for(i=1;i<=4;i++) # loop all indexes in order
print a[i%4] # dont forget the modulo
}' file
1 a,b 5 o,s
2 r,i 6 y
3 w
4 r,t
如果缺少列,自然会很难看。
答案 3 :(得分:1)
这是另一种awk方法: -
public ActionResult Edit(Preference preference)
{
var user = User.Identity.Name;
var userId = (from ui in db.Profiles where user == ui.someUser select ui.Id).SingleOrDefault();
var result = (from r in db.Preferences where userId == r.UserId select r).SingleOrDefault();
var id = result.UserId;
var myPreferences = db.Preferences.SingleOrDefault(am => am.UserId == id);
if (TryUpdateModel(myPreferences))
{
db.SaveChanges();
return View(preference);
}
return View(preference);
}
答案 4 :(得分:1)
你可以结合分割和粘贴
split -l 4 file part- && paste part-*
-l <number>
表示将文件拆分为每个<number>
行的较小文件。part-
是我们选择用于新文件的前缀。请注意,它们将按字母顺序排列,例如part-aa
,part-ab
等。因此paste
会按预期粘贴它们。