我有 20 个具有相同行数的制表符分隔文件。我想选择每个文件的第 4 列,粘贴到一个新文件中。最后,新文件将有 20 列,每列来自 20 个不同的文件。
如何使用 Unix/Linux 命令执行此操作?
输入,20 个相同格式。我希望文件 1 的第 4 列在此处表示为 A1:
chr1 1734966 1735009 A1 0 0 0 0 0 1 0
chr1 2074087 2083457 A1 0 1 0 0 0 0 0
chr1 2788495 2788535 A1 0 0 0 0 0 0 0
chr1 2821745 2822495 A1 0 0 0 0 0 1 0
chr1 2821939 2822679 A1 1 0 0 0 0 0 0
...
Run Code Online (Sandbox Code Playgroud)
输出文件,有 20 列,每列来自 …
该paste命令可以将多行合并为一行。例如,如果我有一个文件test.txt并且它包含:
a
aa
aaa
b
bb
bbb
c
cc
ccc
Run Code Online (Sandbox Code Playgroud)
我可以使用命令paste -s -d '\t\t\n' test.txt来获取:
a aa aaa
b bb bbb
c cc ccc
Run Code Online (Sandbox Code Playgroud)
我想知道是否有反向命令可以执行粘贴的反向操作。例如,如果我有“处理结果”,我怎样才能得到“原始文本”?
假设我有两个文本文件 a、b。
$cat a
a a
a a
a a
$cat b
b b
b b
b b
Run Code Online (Sandbox Code Playgroud)
然后,我想使用粘贴垂直合并这两个文件。合并后的文件如下所示
a a
a a
a a
b b
b b
b b
Run Code Online (Sandbox Code Playgroud)
不是
$paste a b > AB
$cat AB
a a b b
a a b b
a a b b
Run Code Online (Sandbox Code Playgroud) 我有两个文件:
a.txt
1
2
3
Run Code Online (Sandbox Code Playgroud)
b.txt
foo
bar
baz
qux
Run Code Online (Sandbox Code Playgroud)
跑步paste a.txt b.txt给予
1 foo
2 bar
3 baz
qux
Run Code Online (Sandbox Code Playgroud)
但是,我想在最短的文件结束时停止(也就是说,我只想打印完整的行,否则管道中的后续程序会认为qux第一个字段是第二个字段,而实际上这是唯一的方法)。我怎样才能做到这一点?
艺术文件(cat -A输出):
.::""-, .::""-.$
/:: \ /:: \$
|:: | _..--""""--.._ |:: |$
'\:.__ / .' '. \:.__ /$
||____|.' _..---"````'---. '.||____|$
||:. |_.' `'.||:. |$
||:.-'` .-----. ';:. |$
||/ .' '. \. |$
|| / '-. '. \\ |. |$
||:. _| ' \_\_\\/( \ |$
||:.\_.-' ) || m `\.--._.-""-;$
||:.(_ . '\ __'// m ^_/ / '. _.`.$
||:. \__^/` _)```'-...' _ .-'.' '-.$
||:..-'__ .' '. . ' '. `'.$
||:(_.' .`' _. …Run Code Online (Sandbox Code Playgroud) 我想在两列中打印两个文件——第一个文件在左侧,第二个文件在右侧。
paste 不做这项工作,因为它只能插入一个字符作为分隔符,所以如果第一个文件行的长度不同,输出将被扭曲:
$ cat file1
looooooooong line
line
$ cat file2
hello
world
$ paste file1 file2
looooooooong line hello
line world
Run Code Online (Sandbox Code Playgroud)
如果这是一个添加尾随空格的命令,fmt --add-spaces --width 50问题将得到解决:
$ paste <(fmt --add-spaces --width 50 file1) file2
looooooooong line hello
line world
Run Code Online (Sandbox Code Playgroud)
但我不知道一个简单的方法来做到这一点。
那么如何在不扭曲的情况下水平合并打印多个文件呢?其实,我只是想同时看它们。
UPD:添加尾随空格的命令确实存在(例如,xargs -d '\n' printf '%-50s\n')
但解决方案如
$ paste <(add-trailing-spaces file1) file2
Run Code Online (Sandbox Code Playgroud)
当 file1 的行数少于 file2 时,它不会按预期工作。
这个问题基于Ask\xe2\x80\xafUbuntu 上的 \xc2\xa0similar 问题,\n但不是bash,我\xc2\xa0 希望在 中获得类似的输出sh。
bash 中没有问题;它按预期工作。
\nwolf@linux:~$ echo $SHELL\n/usr/bin/bash\nwolf@linux:~$ \nwolf@linux:~$ varA=\'Aug 01\n> Aug 16\n> Aug 26\'\nwolf@linux:~$ \nwolf@linux:~$ varB=\'04:25\n> 03:39\n> 10:06\'\nwolf@linux:~$ \nwolf@linux:~$ echo "$varA $varB"\nAug 01\nAug 16\nAug 26 04:25\n03:39\n10:06\nwolf@linux:~$\nwolf@linux:~$ paste <(printf %s "$varA") <(printf %s "$varB")\nAug 01 04:25\nAug 16 03:39\nAug 26 10:06\nwolf@linux:~$\nRun Code Online (Sandbox Code Playgroud)\n但是,当我在 中尝试类似的命令时sh,我收到以下错误。
wolf@linux:~$ sh\n$ \n$ varA=\'Aug 01\n> Aug 16\n> Aug 26\'\n\n$ varB=\'04:25\n> 03:39\n> 10:06\'\n$ \n$ echo "$varA $varB"\nAug 01\nAug 16\nAug 26 04:25\n03:39\n10:06\n$ \n$ paste <(printf …Run Code Online (Sandbox Code Playgroud) 我想合并包含不同行数但列数相同的两个 txt 文件中的特定列(如下所示):
file1:
xyz desc1 12
uvw desc2 55
pqr desc3 12
file2:
xyz desc1 56
uvw desc2 88
Preferred output:
xyz desc1 12 56
uvw desc2 55 88
pqr desc3 12 0
Run Code Online (Sandbox Code Playgroud)
目前我使用 awk 作为粘贴命令:
paste <(awk '{print $1}' file1) <(awk '{print $2}' file1) <(awk '{print $3}' file1) <(awk '{print $3}' file2)
Run Code Online (Sandbox Code Playgroud)
但这似乎只合并重叠的列。awk 中有没有办法插入零而不是省略行本身?
我需要将 100 个文件组合在一起,这样我的输出文件将包含 102 列。
我想合并两个文件,例如如何根据两列的匹配合并两个文件?但一个文件可能无法包含所有结果。例如
文件1
1 dog
2 cat
3 fox
4 cow
Run Code Online (Sandbox Code Playgroud)
文件2
1 woof
2 meow
4 mooh
Run Code Online (Sandbox Code Playgroud)
想要的输出
1 dog woof
2 cat meow
3 fox
4 cow mooh
Run Code Online (Sandbox Code Playgroud) 我有一个像这样的粘贴命令
paste -d , file1.csv file2.csv file3.csv
file2.csv 包含这样的数字
0.2
0.3339
0.111111
Run Code Online (Sandbox Code Playgroud)
我希望 file2.csv 中的值具有 3 位小数,如下所示:
0.200
0.334
0.111
Run Code Online (Sandbox Code Playgroud)
对于一个值,这是有效的:
printf "%.3f" "0.3339"->0.334
但对于 file2.csv 中的多个值,这不起作用:
paste -d , file1.csv <(printf %s "%.3f" "$(< file2.csv)") file3.csv
也许有一个好的解决方案?