相关疑难解决方法(0)

使用AWK处理来自多个文件的输入

很多人通过一次发布AWK多个输入文件的以下解决方案非常有帮助:

$ awk 'FNR==NR{a[$1]=$2 FS $3;next}{ print $0, a[$1]}' file2 file1
Run Code Online (Sandbox Code Playgroud)

这很好用,但我想知道我是否有人可以向我解释原因?我发现AWK语法有点难以掌握,希望有人不介意为我打破代码片段.

awk

58
推荐指数
3
解决办法
8万
查看次数

什么是awk中的"NR == FNR"?

我正在学习文件比较awk.

我找到了如下的语法,

awk 'NR==FNR{a[$1];next}$1 in a{print $1}' file1 file2
Run Code Online (Sandbox Code Playgroud)

我无法理解这NR==FNR在什么意义?如果我尝试,FNR==NR那么我也得到相同的输出?

到底是做什么的?

unix linux awk

57
推荐指数
5
解决办法
8万
查看次数

内部连接两个文本文件

希望在两个不同的文本文件上执行内部联接.基本上我正在寻找GNU连接程序的内连接等价物.这样的事情存在吗?如果没有,awk或者sed解决方案最有帮助,但我的第一选择是Linux命令.

这是我想要做的一个例子

档案1:

0|Alien Registration Card LUA|Checklist Update
1|Alien Registration Card LUA|Document App Plan
2|Alien Registration Card LUA|SA Application Nbr
3|Alien Registration Card LUA|tmp_preapp-DOB
0|App - CSCE Certificate LUA|Admit Type
1|App - CSCE Certificate LUA|Alias 1
2|App - CSCE Certificate LUA|Alias 2
3|App - CSCE Certificate LUA|Alias 3
4|App - CSCE Certificate LUA|Alias 4
Run Code Online (Sandbox Code Playgroud)

档案2:

Alien Registration Card LUA
Run Code Online (Sandbox Code Playgroud)

结果:

0|Alien Registration Card LUA|Checklist Update
1|Alien Registration Card LUA|Document App Plan
2|Alien Registration Card LUA|SA Application …
Run Code Online (Sandbox Code Playgroud)

linux bash join

8
推荐指数
3
解决办法
9417
查看次数

将文件的特定列复制到C中的另一个文件

我有两个文件,第一个看起来像这样

125 6.678
435 9.084
234 8.874
Run Code Online (Sandbox Code Playgroud)

等我的程序生成的大约2,048,000个条目.第二个文件是由gnuplot生成的文件,看起来有点像:

65 321456 985
78 98374  834
54 8493   848
Run Code Online (Sandbox Code Playgroud)

等约有2,048,000个参赛作品.

现在我需要做的是用3D中的gnuplot绘制第一个文件的第二列和第二个文件的两列.我认为第一个任务是将它们全部放入同一个文件中,我只想编写一个简单的c程序,快速读取这两个文件并将相关列放在一个文件中,但我不知道该怎么做.我知道如何复制文件的全部内容并使用ac程序将它们写入另一个文件 - 例如,为此,我有以下代码:

#include <stdio.h>
#include <stdlib.h>

int main (int argc, const char * argv[])
{
FILE *avalanche_size_BM;
FILE *avalanche_size_BM_2000;
char ch;


avalanche_size_BM = fopen("/Users/maheensiddiqui/Documents/MSc_Proj/avalanche_size_BM.dat","r");

if (avalanche_size_BM == NULL) 
{
    printf("I couldn't open.\n");
    exit(0);
}
avalanche_size_BM_2000 = fopen("/Users/maheensiddiqui/Desktop/avalanche_size_BM_2000.dat", "w");
if (avalanche_size_BM_2000 == NULL) 
{
    printf("I couldn't open.\n");
    exit(0);
}

printf("\n success!!");

while((ch=getc(avalanche_size_BM))!=EOF)
      putc(ch,avalanche_size_BM_2000);

fclose(avalanche_size_BM);
fclose(avalanche_size_BM_2000);



return(0);
}
Run Code Online (Sandbox Code Playgroud)

但是我怎么告诉它只读第一个文件中的第二列和第二个文件中的前两列并将它们(而不是所有列)复制到第三个文件,我可以用它来绘制我的三维图.

任何帮助都感激不尽!

谢谢

c file-io gnuplot

5
推荐指数
1
解决办法
2183
查看次数

使用 awk 或 sed 根据公共列合并两个 csv 文件

我有一个两个 CSV 文件,两个文件中有一个公共列,并且一个文件中有重复项。如何使用 awk 或 sed 合并两个 csv 文件?

CSV 文件 1

5/1/20,user,mark,Type1 445566
5/2/20,user,ally,Type1 445577
5/1/20,user,joe,Type1 445588
5/2/20,user,chris,Type1 445566
Run Code Online (Sandbox Code Playgroud)

CSV 文件 2

Type1 445566,Name XYZ11
Type1 445577,Name AAA22
Type1 445588,Name BBB33
Type1 445566,Name XYZ11
Run Code Online (Sandbox Code Playgroud)

我想要的是?

5/1/20,user,mark,Type1 445566,Name XYZ11
5/2/20,user,ally,Type1 445577,Name AAA22
5/1/20,user,joe,Type1 445588,Name BBB33
5/2/20,user,chris,Type1 445566,Name XYZ11
Run Code Online (Sandbox Code Playgroud)

那么Linux/Unix中有没有bash命令可以实现这一点呢?我们可以使用 awk 或 sed 来完成此操作吗?

基本上,我需要将 CSV 文件 1 的第 4 列与 CSV 文件 2 的第 1 列进行匹配,并合并两个 csv。

尝试了以下命令:

命令:

粘贴 -d, <(剪切 -d, -f 1-2 ./test1.csv | sed 's/$/,Type1/') test2.csv …

unix linux bash awk sed

5
推荐指数
2
解决办法
6397
查看次数

合并/加入两个表快速linux命令行

假设我有两个相对较大的制表符分隔文件file1.txt,file2.txt.

file1.txt
id\tcity\tcar\ttype\tmodel

file2.txt 
id\tname\trating
Run Code Online (Sandbox Code Playgroud)

我们假设file1.txt有2000个唯一ID,因此有2000个唯一行,而file2.txt只有1000个唯一行,因此有1000个唯一ID.有没有办法合并这两个表?

情况1.通过file1.txt中的id合并它们,其中当file2.txt中没有id时,将填写NAs.

案例2.在file2.txt中通过id合并它们,其中只有file2.txt中的id将打印出file1.txt和file2.txt中的字段.

注意:合并的新文件也应该是制表符分隔的文件,也带有头文件.笔记2.我也很欣赏在没有标题的情况下如何做到这一点的建议.

谢谢!

unix linux merge awk join

4
推荐指数
1
解决办法
1万
查看次数

标签 统计

awk ×4

linux ×4

unix ×3

bash ×2

join ×2

c ×1

file-io ×1

gnuplot ×1

merge ×1

sed ×1