使用包含列 x 的 3 个文件中的数据,我需要输出列帐户中的数据

Using the data in 3 files containing column x I need to output the data in column account

我有 3 个 txt 文件,即 file1 、 file2 、 file3 ,其中包含用“|”分隔的数据 我需要过滤所有在 columnx 中只有“1”的行,并在 "account"

列中打印值

file1.txt

  line|account|column3|columnx
  line1|111111|jahadkadaldabndal|1
  line2|2323413341|adajkadadbjkqqweq|0
  line3|21122|adaieaqelqq|0
  line4|236521|jadad|1

file2.txt

  line|account|column3|columnx
  line1|1117831|jahadkadaldabndal|1
  line2|23234178841|adajkadadbjkqqweq|1
  line3|21122|adaieaqelqq|0
  line4|236526|jadad|1

file3.txt

  line|account|column3|columnx
  line1|1113333|jahadkadaldabndal|1
  line2|232341335|adajkadadbjkqqweq|1
  line3|21124|adaieaqelqq|1
  line4|236523|jadad|1

输出应该是这样的:

 111111
 236521
 1113333
 236523
 21124
 232341335
 1117831
 23234178841
 236526

我有一个代码,但在线只有一个文件 txt。

    powershell -nop -c "(import-csv .\*.txt -del '|'|? columnx -eq 1).account"

我还在想我应该用什么我在这方面真的很新,谁能教我或给我一些代码,这样我就可以完成这个了,谢谢。

因为您还提供了 batch-file 标签:

@echo off
for /f "tokens=2 delims=|" %%a in ('type file*.txt 2^>nul ^|findstr /e "|1"') do (
   echo %%a|findstr /x "[0-9][0-9]*"
)

从以 |1 结尾的每一行中获取第二个标记,并将其过滤为 "numbers only"

@echo off
for %%A in (*.txt) do for /F "usebackq skip=1 tokens=2,4 delims=|" %%A in ("%%~A") do (
    for %%B in (%%B) do if %%B EQU 1 echo %%A
)
pause

for %%A in (*.txt) 遍历每个文本文件。可以适当设置通配符,例如file*.txt 或适合您情况的任何内容。

for /F "usebackq skip=1 tokens=2,4 delims=|" 读取由 parent FOR 传递的每个文件,逐行处理每个文件从每行中获取标记 2 和 4(即 account 和 columnx) . skip=1 如果文件包含 header 则跳过第一行 line|account|column3|columnx 如果不删除 skip=1

for %%B in (%%B) 是从最后一个标记(columnx)中删除任何 leading/trailing 空格,以便与 1 进行比较,如果最后一列包含空格则正确。

好吧,您的 powershell 命令已经快完成了,您只需要一个 foreach 循环。

此处打印出任何 account 值,其中 columnx1:

Get-ChildItem -Filter "*.txt" | % {Import-Csv $_.Fullname -Delimiter '|'} | Where-Object {$_.columnx -eq 1} | Select-Object -ExpandProperty account

请注意 % 只是 foreach 的别名,而 $_ 等于循环中的每个 object,因此每个 .csv 都给它。


要跟进评论中的问题:

如果我的txt文件没有header怎么办?

Import-Csv 有一个 -Header 选项,可以让您为导入添加 Headers,在您的情况下它应该如下所示:

Get-ChildItem -Filter "*.txt" | % {Import-Csv $_.Fullname -Delimiter '|' -Header "line","account","column3","columnx"} | Where-Object {$_.columnx -eq 1} | Select-Object -ExpandProperty account

如果我需要最后两列的值为“1”怎么办

您可以像这样使用 -andWhere-Object 添加额外的检查:

Get-ChildItem -Filter "*.txt" | % {Import-Csv $_.Fullname -Delimiter '|'} | Where-Object {$_.columnx -eq 1 -and $_.column3 -eq 1} | Select-Object -ExpandProperty account